最近產(chǎn)品需要改短信驗(yàn)證碼界面擎厢,這里隨手寫了一個demo椭坚,分享給大家良价。
參考:http://www.reibang.com/p/fce6bd4038eb寝殴,做了一定的修改,效果如下
在調(diào)用做了封裝明垢,只需要調(diào)用如下代碼即可實(shí)現(xiàn)效果:
self.verifyView = [[verifyCodeView alloc]initWithFrame:CGRectMake((self.view.frame.size.width-4*VerifyCodeHeight-VerifyCodeSpacing * 3)/2,150,? 4*VerifyCodeHeight+VerifyCodeSpacing * 3, VerifyCodeHeight) andLabelCount:4 andLabelDistance:VerifyCodeSpacing isCircle:_isCircle];
[self.view addSubview:self.verifyView];
參數(shù)說明:verifyCodeView
- (instancetype)initWithFrame:(CGRect)frame andLabelCount:(NSInteger)labelCount andLabelDistance:(CGFloat)labelDistance isCircle:(BOOL)isCirce;
labelCount即驗(yàn)證碼/密碼個數(shù)蚣常,labelDistance驗(yàn)證碼間距,isCircle 是否為圓顯示痊银,如果為false則顯示為正方形空格抵蚊。
這里倒計(jì)時使用的GCD,如果需要只需要調(diào)用getNumBtnAction.方法即可實(shí)現(xiàn)倒計(jì)時效果溯革。
方法如下:
/// 倒計(jì)時操作
- (void)getNumBtnAction{
[self.reacquireBtn setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
__block NSInteger second = 60;
//全局隊(duì)列? ? 默認(rèn)優(yōu)先級
dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//定時器模式? 事件源
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, quene);
//NSEC_PER_SEC是秒泌射,*1是每秒
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), NSEC_PER_SEC * 1, 0);
//設(shè)置響應(yīng)dispatch源事件的block,在dispatch源指定的隊(duì)列上運(yùn)行
dispatch_source_set_event_handler(timer, ^{
//回調(diào)主線程鬓照,在主線程中操作UI
dispatch_async(dispatch_get_main_queue(), ^{
if (second >= 0) {
[_reacquireBtn setTitle:[NSString stringWithFormat:@"%ld秒后重新獲取",second] forState:UIControlStateNormal];
second--;
}else
{
//這句話必須寫否則會出問題
dispatch_source_cancel(timer);
[_reacquireBtn setTitle:@"獲取驗(yàn)證碼" forState:UIControlStateNormal];
[_reacquireBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
}
});
});
//啟動源
dispatch_resume(timer);
}
效果是實(shí)現(xiàn)思路:在控制器上添加textField熔酷,然后監(jiān)聽textField,講輸入內(nèi)容分別到label上即可豺裆。
這樣做很大程度上減少了控制器的層級結(jié)構(gòu)拒秘,優(yōu)化app性能,具體代碼見demogithub下載地址臭猜。