倒计时功能会经常出现在项目中,通过给UIButton的类别中添加一个方法,在项目中初始化button后调用该方法,就可以很友好的实现倒计时功能了,使用的时候只需要传入一个参数(总时间),然后在方法的后面有两个block 的回调,分别回调当前倒计时和倒计时结束先来看看效果图:
下面看看调用地方的代码:
#pragma mark ---开始倒计时点击事件
-(void)startAction{
NSInteger time =8;
[_endBt setTitle:[NSString stringWithFormat:@"%zd",time] forState:UIControlStateNormal];
[_startBt startTime:time waitBlock:^(NSInteger remainTime) {
DLog(@"%zd",remainTime);
[_endBt setTitle:[NSString stringWithFormat:@"%zd",remainTime] forState:UIControlStateNormal];
} finishBlock:^{
DLog(@"finishBlock");
[_endBt setTitle:@"倒计时结束" forState:UIControlStateNormal];
}];
}
UIButton+CountDown.h
@interface UIButton (CountDown)
/**
倒计时按钮
@param timeout 总时间
@param waitBlock 倒计时过程中可以再里面做一些操作
@param finishBlock 完成时执行的block
*/
- (void)startTime:(NSInteger)timeout waitBlock:(void(^)(NSInteger remainTime))waitBlock finishBlock:(void(^)())finishBlock;
@end
UIButton+CountDown.m
@implementation UIButton (CountDown)
- (void)startTime:(NSInteger)timeout waitBlock:(void(^)(NSInteger remainTime))waitBlock finishBlock:(void(^)())finishBlock{
__block NSInteger timeOut = timeout;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _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); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeOut <= 0){ //倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
if (finishBlock){
finishBlock();
}
self.userInteractionEnabled = YES;
});
}else{
dispatch_async(dispatch_get_main_queue(), ^{
if (waitBlock){
waitBlock(timeOut);
}
self.userInteractionEnabled = NO;
});
timeOut--;
}
});
dispatch_resume(_timer);
}
@end