在iOS应用开发中,有很多用到获取验证码的倒计时,所以可以写个Demo以方便后面使用。
- 废话不多说,直接上代码
@implementation ViewController
{
UIButton * _receiveCheckNumButton;
}
- (void)viewDidLoad {
[super viewDidLoad];
_receiveCheckNumButton = [[UIButton alloc] initWithFrame:CGRectMake(([UIScreen mainScreen].bounds.size.width - 100)/2, 100, 100, 40 )];
_receiveCheckNumButton.backgroundColor = [UIColor purpleColor];
[_receiveCheckNumButton setTitle:@"获取验证码" forState:UIControlStateNormal];
[_receiveCheckNumButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_receiveCheckNumButton.titleLabel.font = [UIFont systemFontOfSize:13];
_receiveCheckNumButton.layer.cornerRadius = 5;
_receiveCheckNumButton.layer.masksToBounds = YES;
_receiveCheckNumButton.alpha = 0.3;
[_receiveCheckNumButton addTarget:self action:@selector(receiveCheckNumButton) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_receiveCheckNumButton];
}
//获取验证码倒计时
- (void)receiveCheckNumButton{
__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(), ^{
//设置界面的按钮显示 根据自己需求设置
[_receiveCheckNumButton setTitle:@"重新获取" forState:UIControlStateNormal];
_receiveCheckNumButton.userInteractionEnabled = YES;
_receiveCheckNumButton.backgroundColor = [UIColor purpleColor];
});
}else{
int seconds = timeout;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//让按钮变为不可点击的灰色
_receiveCheckNumButton.backgroundColor = [UIColor grayColor];
_receiveCheckNumButton.userInteractionEnabled = NO;
//设置界面的按钮显示 根据自己需求设置
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[_receiveCheckNumButton setTitle:[NSString stringWithFormat:@"%@秒后重发",strTime] forState:UIControlStateNormal];
[UIView commitAnimations];
});
timeout--;
}
});
dispatch_resume(_timer);
}