aischool 倒计时VIEW封装

@implementation TWPaperTimeCountLabel

{

NSInteger miaoshu;

dispatch_source_t _timer;

}

-(id)initWithframe:(CGRect)frame endTime:(NSDate *)endtime delegate:(id<TWPaperTimelabelDelegate>)delegate

{

self = [super initWithFrame:frame];

if (self) {

self.delegate = delegate;

[self setcontentWith:endtime];

}

return self;

}

-(id)initWithframe:(CGRect)frame endTimeStr:(NSString *)endtimestr delegate:(id<TWPaperTimelabelDelegate>)delegate

{

self = [super initWithFrame:frame];

if (self) {

self.delegate = delegate;

if (endtimestr!=nil && [endtimestr isKindOfClass:[NSString class]]) {

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *destDate= [dateFormatter dateFromString:endtimestr];

[self setcontentWith:destDate];

}

}

return self;

}

-(void)reloadTime:(NSString *)endtimestr

{

if (endtimestr!=nil && [endtimestr isKindOfClass:[NSString class]]) {

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *destDate= [dateFormatter dateFromString:endtimestr];

[self setcontentWith:destDate];

}

}

-(void)setcontentWith:(NSDate *)data

{

NSDate *now = [NSDate new];

NSCalendar *cal = [NSCalendar currentCalendar];

unsigned int unitFlags =   NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;

NSDateComponents *d = [cal components:unitFlags fromDate:now toDate:data options:0];

NSInteger alltime = [d day]*3600*24+[d hour]*3600+[d minute]*60+[d second];

if(alltime>0)

{

[self GCDtimeresume:alltime];

}else

{

if (self.delegate!=nil && [self.delegate respondsToSelector:@selector(paperCountdownIsOver:)]) {

[self.delegate paperCountdownIsOver:self];

}

}

}

-(void)GCDtimeresume:(NSInteger)alltimeSecond

{

__block NSInteger timeout=alltimeSecond; //倒计时时间

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行

WEAKSELF;

dispatch_source_set_event_handler(_timer, ^{

if(weakSelf == nil)

{

dispatch_source_cancel(_timer);

}

if(timeout<=0){ //倒计时结束,关闭

dispatch_source_cancel(_timer);

dispatch_async(dispatch_get_main_queue(), ^{

if (weakSelf.delegate!=nil && [weakSelf.delegate respondsToSelector:@selector(paperCountdownIsOver:)]) {

[weakSelf.delegate paperCountdownIsOver:weakSelf];

}

});

}else{

[weakSelf setlabel:timeout];

timeout--;

}

});

dispatch_resume(_timer);

}

-(void)stopcount

{

if(_timer)

{

dispatch_source_cancel(_timer);

}

}

-(void)setlabel:(NSInteger)alltimeSecond

{

NSString *content =@"倒计时: ";

NSInteger seconds = alltimeSecond % 60;

NSInteger minutes = (alltimeSecond / 60) % 60;

NSInteger hours = alltimeSecond / 3600;

if (hours>0) {

content =[content stringByAppendingString:[NSString stringWithFormat:@"%ld小时",(long)hours]];

}

if (minutes>0) {

content =[content stringByAppendingString:[NSString stringWithFormat:@"%ld分",(long)minutes]];

}

if (seconds>0) {

content =[content stringByAppendingString:[NSString stringWithFormat:@"%ld秒",(long)seconds]];

}

dispatch_async(dispatch_get_main_queue(), ^{

self.text = content;

});

}

时间: 2024-10-18 09:48:08

aischool 倒计时VIEW封装的相关文章

android 中使用View的消息队列api更新数据

基本上只要继承自View的控件,都具有消息队列或者handler的一些处理方法,下面是一些handler方法以及被View封装了的方法,其底层用的基本都是handler的api. 我么开一下postDelay的定义 android.view.View  public boolean postDelayed(Runnable action, long delayMillis) {         final AttachInfo attachInfo = mAttachInfo;         

Android倒计时电子钟的实现(下篇)

本篇继续上篇未完成的部分,这篇文章会实现动态效果如图所示 在程序中先给定一个截止时间: 2014-12-20 00:00:00 然后计算当期时间和截止时间相差的时间 private long getCurrentShowTimeSeconds() { Date curTime = new Date(); long ret = endDate.getTime() - curTime.getTime(); ret =Math.round( ret/1000 ); return ret >= 0 ?

Android倒计时电子钟的实现(上篇)

习惯了Android的默认倒计时字体,这里采用Canvas画图的方式实现倒计时时钟效果,首先先看一下静态效果 不难发现,每个数字都是一个小圆形,也可以改成一个小正方形等等,这些都是可以实现的. 这里使用圆形. 仔细观察数字发现其是由一个二维数组组成,类似如下所示:根据下面数组可以画出0的,效果 {0,0,1,1,1,0,0}, {0,1,1,0,1,1,0}, {1,1,0,0,0,1,1}, {1,1,0,0,0,1,1}, {1,1,0,0,0,1,1}, {1,1,0,0,0,1,1},

通用Adapter与ListView滚动时不加载图片的封装

本文原创,转载请注明链接:http://blog.kymjs.com/ 在Android开发中写Adapter是一件非常麻烦的事情,枯燥重复,却又不得不去做. 对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder存储,其实大部分的代码都是类似的.那么本文就带大家一起做一次将Adapter封装成一个通用的Adapter. 关于本文的完整Demo,可以参考KJFrameForAndroid开发框架2.2版本中封装的实例,KJAdapter和Ada

iOS快速实现一个保存记录的倒计时按钮

iOS开发中在登录.注册.找回密码等页面经常需要实现倒计时按钮,但是很多情况下用户点击倒计时按钮开始倒计时之后,再次进入页面,又可以再次点击,倒计时记录不会保留,虽然一般情况下服务端会再次校验,但是我们可以实现得更加严谨. ZXCountDownView 支持自动保存倒计时记录,即使退出当前控制器,重启App,倒计时仍然保留,支持多个不同控制器共用一个倒计时记录,例如登录.注册.找回密码页面共用一个倒计时记录,点击任意一个按钮倒计时记录将实时同步. ZXCountDownView 安装 通过Co

[HMLY]7.iOS MVVM+RAC 从框架到实战

1.MVVM浅析 MVC是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式,市面上大部分App都是这样构建的,具体组织模式不细说,iOS入门者都比较了解(虽然不一定能完全去遵守),但其几个不能避免的问题却是很严重困扰开发者,比如厚重的ViewControlller.遗失的网络逻辑(没有属于它的位置).较差的可测试性等.因此也就会有维护性很强.耦合性很低的一种新架构MVVM(MVC引申出的最新架构)的流行. MVVM虽然来自微软,但是不应该反对它,它正式规范了视图和控制器紧耦合

在滚动列表中实现视频的播放(ListView &amp; RecyclerView)

英文原文:Implementing video playback in a scrolled list (ListView & RecyclerView) 本文将讲解如何在列表中实现视频播放.类似于诸如 Facebook, Instagram 或者 Magisto这些热门应用的效果: Facebook: Magisto: Instagram: 这片文章基于开源项目: VideoPlayerManager. 所有的代码和示例都在那里.本文将跳过许多东西.因此如果你要真正理解它是如何工作的,最好下载

项目重构之路

这段时间在忙着给公司,一个WPF项目做一些功能,该项目的背景介绍 两年以上的运维和迭代历史 有一点点“三层”架构感觉,有View(WPF具体窗口,基本上所有逻辑多在这),Model(没有明确的定义ViewModel,还是数据Model),Bll(提供给View 的是DataSet,DataTable,只是一个提供数据给View封装的地方) 由于是C/S结构的项目,部署环境考虑,通过WebService 来实现程序和数据库沟通,提供的数据结构,是不易于操作的DataSet,DataTable. 对

MVC与设计模式的关系及MVC的实现原理和设计原理

1 MVC介绍 众所周知MVC不是设计模式,是一个比设计模式更大一点的模式,称作设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了很多的设计模式,最为密切是以下三种:Observer (观察者模式), Composite(组合模式)和Strategy(策略模式).所以说MVC模式又称复合模式.MVC(Model-View-Controller) 模式的基本思想是数据,显示和处理相分离.模型(Model)负责数据管理,视图(View)负责数据显示,控制器(Controller)负责业务