//第一種方法 //點選button倒數計時
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIButton * timeButton;
@property (nonatomic, strong) NSTimer * timer;
@property (nonatomic, strong)UIButton * btn;
@end@implementation ViewController
{
NSInteger _time;
}
- (void)viewDidLoad {
[super viewDidLoad];
_time = 5;
self.btn = [UIButton buttonWithType:UIButtonTypeCustom]; _btn.backgroundColor = [UIColor orangeColor];
[_btn setTitle:@"獲取驗證碼" forState:UIControlStateNormal]; _btn.titleLabel.font = [UIFont systemFontOfSize:15];
[_timeButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self refreshButtonWidth];
[self.view addSubview:self.btn];
}
- (void)refreshButtonWidth{
CGFloat width = 0;
if (_btn.enabled){
width = 100;
} else {
width = 200;
}
_btn.center = CGPointMake(self.view.frame.size.width/2, 200);
_btn.bounds = CGRectMake(0, 0, width, 40);
//每次重新整理,保證區域正確
[_btn setBackgroundImage:[self imageWithColor:[UIColor orangeColor] andSize:_btn.frame.size] forState:UIControlStateNormal];
[_btn setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor] andSize:_btn.frame.size] forState:UIControlStateDisabled];
}
- (UIImage *)imageWithColor:(UIColor *)color andSize:(CGSize)aSize{
CGRect rect = CGRectMake(0.0f, 0.0f, aSize.width, aSize.height); UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
return image;
}
- (void)btnAction:(UIButton *)sender{
sender.enabled = NO;
[self refreshButtonWidth];
[sender setTitle:[NSString stringWithFormat:@"獲取驗證碼(%zi)", _time] forState:UIControlStateNormal];
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timeDown) userInfo:nil repeats:YES];
}
- (void)timeDown{
_time --;
if (_time == 0) {
[_btn setTitle:@"重新獲取" forState:UIControlStateNormal]; _btn.enabled = YES;
[self refreshButtonWidth];
[_timer invalidate];
_timer = nil;
_time = 5 ;
return;
}
[_btn setTitle:[NSString stringWithFormat:@"獲取驗證碼(%zi)", _time] forState:UIControlStateNormal];
}
複製程式碼
//第二種方法
#pragma mark -點選傳送驗證碼
- (void)sendMessage:(UIButton *)btn{
if (self.phoneField.text.length == 0) {
[self remindMessage:@"請輸入正確的手機號"];
}else{
__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(), ^{
// 設定介面的按鈕顯示 根據自己需求設定
[btn setTitle:@"傳送驗證碼" forState:UIControlStateNormal]; btn.userInteractionEnabled = YES;
});
}else{
int seconds = timeout % 60;
NSString *strTime = [NSString stringWithFormat:@"%d", seconds];
if ([strTime isEqualToString:@"0"]) {
strTime = [NSString stringWithFormat:@"%d",60];
}
dispatch_async(dispatch_get_main_queue(), ^{
//設定介面的按鈕顯示 根據自己需求設定
//NSLog(@"____%@",strTime);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[btn setTitle:[NSString stringWithFormat:@"%@秒後重新傳送",strTime] forState:UIControlStateNormal];
[UIView commitAnimations];
btn.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}
複製程式碼