最近项目上需要一个倒计时按钮的功能,于是就写了个倒计时的功能分类。先来看看效果吧。
倒计时.gif 再说如何实现这个功能如何实现之前,让我类吹吹他的有点吧 1、只要一句话就可以实现倒计时啦 2、他不会产生产生循环引用 在写这个功能的时候,就想写一个工具类,下次使用的时候直接拖过来。而且,这个倒计时不能局限于 UIButton ,而应该在每个类都能被使用,于是就给 NSObject 写个分类,因为OC中所有的类都是继承于 NSObject 的嘛,它有了继承于他的儿子们 也都有了。 上菜(代码)了!首先是分类的.h文件了 #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> typedef void(^TYNCountDownBlock)(NSUInteger timer); typedef void(^TYNFinishBlock)(); @interface NSObject (CountDown) /** 按钮倒计时 @param time 倒计时总时间 @param countDownBlock 每秒倒计时会执行的block @param finishBlock 倒计时完成会执行的block */ - (void)countDownTime:(NSUInteger)time countDownBlock:(TYNCountDownBlock)countDownBlock outTimeBlock:(TYNFinishBlock)finishBlock; @end 然后就是我们的实现类了
#import "NSObject+CountDown.h"
#import <objc/runtime.h>
@interface NSObject ()
/** 定时器 */
@property (nonatomic,strong) dispatch_source_t timer;
@end
@implementation NSObject (CountDown)
- (void)countDownTime:(NSUInteger)time countDownBlock:(TYNCountDownBlock)countDownBlock outTimeBlock:(TYNFinishBlock)finishBlock{
__block NSUInteger second = time;
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1.0f * NSEC_PER_SEC, 1.0f * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
if (countDownBlock != nil) {
countDownBlock(second);
}
});
if ((second--) == 0) {
dispatch_cancel(self.timer);
self.timer = nil;
dispatch_sync(dispatch_get_main_queue(), ^{
if (finishBlock != nil) {
finishBlock();
}
});
}
});
dispatch_resume(self.timer);
}
- (void)setTimer:(dispatch_source_t)timer{
objc_setAssociatedObject(self, @selector(timer), timer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (dispatch_source_t)timer{
return objc_getAssociatedObject(self, @selector(timer));
}
@end
(责任编辑:最模板) |

ecshop英文外贸高尔夫模板
人气:715
免费ecshop仿米奇网化妆品
人气:4400
ecshop玩具礼品商城模板
人气:552
shopex4.85解密开源学习版
人气:5853
化妆品模板 ecshop化妆品网
人气:504
ecshop仿绿森电器数码商城
人气:500