點選button倒數計時

西門吹霧發表於2018-04-17

//第一種方法 //點選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);
}
複製程式碼

相關文章