一.倒計時(如:發送驗證碼)
#define countDownTime 119 //倒計時時間
#pragma mark - 倒計時
- (void)myTimer
{
if (countDownTime) {
__block int timeout= countDownTime; //倒計時時間
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(), ^{
//設置界面的按鈕顯示 根據自己需求設置
});
}else{
int hours = timeout / (60 * 60);
int minute = timeout % (60 * 60) / 60;
int seconds = timeout % 60;
if (hours < 10) {
hours = [[NSString stringWithFormat:@"0%d",hours] intValue];
}
if (minute < 10) {
minute = [[NSString stringWithFormat:@"0%d",minute] intValue];
}
if (seconds < 10) {
seconds = [[NSString stringWithFormat:@"0%d",seconds] intValue];
}
dispatch_async(dispatch_get_main_queue(), ^{
//設置界面的按鈕顯示 根據自己需求設置
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
hourLabel.text = [NSString stringWithFormat:@"%d",hours];
minuteLabel.text = [NSString stringWithFormat:@"%d",minute];
secondsLabel.text = [NSString stringWithFormat:@"%d",seconds];
if (hours < 10) {
hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
}
if (minute < 10) {
minuteLabel.text = [NSString stringWithFormat:@"0%d",minute];
}
if (seconds < 10) {
secondsLabel.text = [NSString stringWithFormat:@"0%d",seconds];
}
[UIView commitAnimations];
});
timeout--;
}
});
dispatch_resume(timer);
}
}
二.倒計時(並計算時間差)
全局變量:dispatch_source_t _timer;
#pragma mark - 倒計時
- (void)countDown{
NSDate *now = [NSDate date];
NSDateFormatter *formatDay = [[NSDateFormatter alloc] init];
formatDay.dateFormat = @"yyyy-MM-dd";
NSString *dayStr = [formatDay stringFromDate:now];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *endDate = [dateFormatter dateFromString:dayStr];
NSDate *endDate_tomorrow = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:([endDate timeIntervalSinceReferenceDate] + 24 * 3600)];
NSDate *startDate = [NSDate date];
NSTimeInterval timeInterval =[endDate_tomorrow timeIntervalSinceDate:startDate];
if (_timer == nil) {
__block int timeout = timeInterval; //倒計時時間
if (timeout != 0) {
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); //每秒執行
dispatch_source_set_event_handler(_timer, ^{
if(timeout <= 0){ //倒計時結束,關閉
dispatch_source_cancel(_timer);
_timer = nil;
dispatch_async(dispatch_get_main_queue(), ^{
hourLabel.text = @"00";
minuteLabel.text = @"00";
secondsLabel.text = @"00";
});
}else{
int hours = (int)(timeout / 3600);
int minutes = (int)(timeout - hours * 3600) / 60;
int seconds = timeout - hours * 3600 - minutes * 60;
dispatch_async(dispatch_get_main_queue(), ^{
if (hours < 10) {
hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
}else{
hourLabel.text = [NSString stringWithFormat:@"%d",hours];
}
if (minutes < 10) {
minuteLabel.text = [NSString stringWithFormat:@"0%d",minutes];
}else{
minuteLabel.text = [NSString stringWithFormat:@"%d",minutes];
}
if (seconds < 10) {
secondsLabel.text = [NSString stringWithFormat:@"0%d",seconds];
}else{
secondsLabel.text = [NSString stringWithFormat:@"%d",seconds];
}
});
timeout--;
}
});
dispatch_resume(_timer);
}
}
}
例子三
__block int timeout=59; //倒計時時間
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(aSelf.timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執行
dispatch_source_set_event_handler(aSelf.timer, ^{
if(timeout<=0){ //倒計時結束,關閉
dispatch_source_cancel(aSelf.timer);
aSelf.timer = nil;
dispatch_async(dispatch_get_main_queue(), ^{
//設置界面的按鈕顯示 根據自己需求設置
});
}else{
// int minutes = timeout / 60;
int seconds = timeout % 60;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//設置界面的按鈕顯示 根據自己需求設置
});
timeout--;
}
});
dispatch_resume(aSelf.timer);
好了以上就是關於ios倒計時的一個實現方法了,這個和js中的倒計時非常的接近的哦各位應該懂了吧。