版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maple_ROSI/article/details/52849319
- UILabel显示倒数
/**
* 倒计时GCD通用方法
* 通常用的计时器都是用NSTimer,但是NSTimer在线程很吃紧的时候效果不佳,使用GCD计时相对更好
*
* @param seconds 倒计时间 单位:秒
* @param showLable 需要显示的文本框
* @param endBlock 倒计时结束后,回调的Block
*/
+ (void)startTimerWithSeconds:(long)seconds showLable:(UILabel *)showLable endBlock:(void (^)())endBlock
{
[self startTimerWithSeconds:seconds showLable:showLable strFormat:nil endBlock:endBlock];
}
调下如下:
[BSTool startTimerWithSeconds:remainTime showLable:self.countdownLable endBlock:^{
self.countdownLable.text = @"订单超时";
[weakSelf.tableView reloadData];
}];
- UILabel 格式显示倒数,并且倒数完成后需要进行另外的操作,则需要用block回调
/**
* 倒计时GCD通用方法
* 通常用的计时器都是用NSTimer,但是NSTimer在线程很吃紧的时候效果不佳,使用GCD计时相对更好
*
* @param seconds 倒计时间 单位:秒
* @param strFormat 格式化样式,如 "剩%@自动关闭"
* @param showLable 需要显示的文本框
* @param endBlock 倒计时结束后,回调的Block
*/
+ (void)startTimerWithSeconds:(long)seconds showLable:(UILabel *)showLable strFormat:(NSString *)format endBlock:(void (^)())endBlock
{
__block long timeout = seconds; // 倒计时时间
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){ // 倒计时结束,回调block
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
if (endBlock) {
endBlock();
}
});
} else{
NSString *strTime = [NSString stringWithFormat:@"%02ld分%02ld秒",(long)(timeout % 3600 / 60), (long)(timeout % 60)];
//回到主界面,显示倒计时
dispatch_async(dispatch_get_main_queue(), ^{
if (format) { // 判断是否要格式化
showLable.text = [NSString stringWithFormat:format,strTime];
} else {
showLable.text = strTime;
}
});
timeout--;
}
});
dispatch_resume(_timer);
}
调用如下:
[BSTool startTimerWithSeconds:payResultModel.remainTime
showLable:self.payStateDescLabel
strFormat:@"剩%@自动关闭"
endBlock:^{
self.payStateDescLabel.text = @"交易关闭";
}];
- 获取短信验证码按钮倒数
// MARK:倒计时
- (void)setTimer {
__block int timeout = 60;
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(), ^{
sendCode.userInteractionEnabled = YES;
[sendCode setTitle:@"获取验证码" forState:UIControlStateNormal];
[sendCode setTitleColor:Color_A1A1A1 forState:UIControlStateNormal];
});
}
else {
int seconds = timeout % 61;
NSString *strTime = [NSString stringWithFormat:@"%.2d",seconds];
dispatch_async(dispatch_get_main_queue(), ^{
[sendCode setTitleColor:Color_A1A1A1 forState:UIControlStateNormal];
[sendCode setTitle:[NSString stringWithFormat:@"%@秒",strTime] forState:UIControlStateNormal];
sendCode.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}