我們經(jīng)常會遇到按鈕上進(jìn)行倒計(jì)時(shí)的情況局服,比如獲取驗(yàn)證碼的時(shí)候钓瞭。本文將講解如何實(shí)現(xiàn)倒計(jì)時(shí)按鈕。為了讓大家清楚地知道本文的意圖淫奔,先上圖:
如圖我使用了兩種方法實(shí)現(xiàn)山涡,一種是利用分類,另一種是利用繼承唆迁。這邊我只講解繼承鸭丛,分類的核心代碼基本同繼承。如果你們想要直接看代碼的話唐责,請點(diǎn)擊 這里 鳞溉。
創(chuàng)建一個(gè)MJCountDownButton類繼承自UIButton,.h中的代碼如下
#import <UIKit/UIKit.h>
@class MJCountDownButton;
typedef void(^Completion)(MJCountDownButton *countDownButton);
@interface MJCountDownButton : UIButton
/**
* @author 王夢杰, 16-06-22 14:06:00
*
* 開始倒計(jì)時(shí)
*
* @param startTime 倒計(jì)時(shí)時(shí)間
* @param unitTitle 倒計(jì)時(shí)時(shí)間單位(如:s)
* @param completion 倒計(jì)時(shí)結(jié)束執(zhí)行的Block
*/
- (void)countDownFromTime:(NSInteger)startTime unitTitle:(NSString *)unitTitle completion:(Completion)completion;
@end
.m中的代碼如下:
#import "MJCountDownButton.h"
#import "UIImage+Color.h"
@implementation MJCountDownButton
- (void)countDownFromTime:(NSInteger)startTime unitTitle:(NSString *)unitTitle completion:(Completion)completion {
__weak typeof(self) weakSelf = self;
// 剩余的時(shí)間(必須用__block修飾,以便在block中使用)
__block NSInteger remainTime = startTime;
// 獲取全局隊(duì)列
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);
// 每隔1s鐘執(zhí)行一次
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
// 在queue中執(zhí)行event_handler事件
dispatch_source_set_event_handler(timer, ^{
if (remainTime <= 0) { // 倒計(jì)時(shí)結(jié)束
dispatch_source_cancel(timer);
// 回到主線程
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.enabled = YES;
completion(weakSelf);
});
} else {
NSString *timeStr = [NSString stringWithFormat:@"%ld", remainTime];
// 回到主線程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf setTitle:[NSString stringWithFormat:@"%@%@",timeStr,unitTitle] forState:UIControlStateDisabled];
[weakSelf setBackgroundImage:[UIImage createImageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled];
weakSelf.enabled = NO;
});
remainTime--;
}
});
dispatch_resume(timer);
}
@end
這邊還利用到一個(gè)UIImge的分類方法鼠哥,該分類的作用是通過一個(gè)顏色對象返回一張圖片對象熟菲,這個(gè)比較實(shí)用。
+ (UIImage *)createImageWithColor:(UIColor *)color {
// 畫布大小
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
// 在當(dāng)前畫布上開啟繪圖上下文
UIGraphicsBeginImageContext(rect.size);
// 畫筆
CGContextRef context = UIGraphicsGetCurrentContext();
// 設(shè)置畫筆顏色
CGContextSetFillColorWithColor(context, [color CGColor]);
// 填充畫布
CGContextFillRect(context, rect);
// 取得畫布中的圖片
UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
// 結(jié)束繪圖上下文
UIGraphicsEndImageContext();
return theImage;
}
文末再次附上源碼地址:去下載朴恳。
順手點(diǎn)個(gè)星的都是好同志抄罕。