最近在做APP时,要使用短信动态码来进行系统认证,google了一下发现没有成熟的实例,在github也找不到好的,基本都存在一点小问题,所以动手写了一个,
实现思路:
1.继承自UIButton,初始化基本的属性;
2.利用Timer类计时方法,每隔一秒执行一次updateLabel方法
3.如果直对按钮title进行修改,会有多数文章提到的闪烁问题,在此使用一个Label覆盖在Button上,大小一致,解决此问题
效果如下:
实现代码:
importUIKit
classO2CountdownButton:UIButton{
//定时秒数
varcount:Int=60
//定时器
vartimer:Timer!
//标签
varlabelTimeS:UILabel!
//默认按钮标题
varnormalText ="获取验证码"{
didSet{
self.setTitle(normalText, for: .normal)
self.layoutIfNeeded()
}
}
//标签字颜色
varlabelTextColor =UIColor.white
//按钮正常背景色
varnormalColor =RGB(251, g:71, b:71) {
didSet{
ifself.isEnabled{
self.backgroundColor=normalColor
self.layoutIfNeeded()
}
}
}
//按钮定时时的背景色
vardisableColor =toolbar_text_color{
didSet{
if!self.isEnabled{
self.backgroundColor=disableColor
self.layoutIfNeeded()
}
}
}
overridefuncawakeFromNib() {
super.awakeFromNib()
labelTimeS=UILabel(x:0, y:0, w:self.frame.size.width, h:self.frame.size.height)
labelTimeS.textAlignment= .center
labelTimeS.font=UIFont(name:"PingFangSC-Regular", size:14.0)!
labelTimeS.text=normalText
labelTimeS.textColor=labelTextColor
//self.addSubview(labelTimeS)
self.setTitle(normalText, for: .normal)
self.setTitleColor(UIColor.white, for: .normal)
self.backgroundColor=normalColor
}
publicfuncstartCount(){
self.isEnabled=false
//把按钮本身标题清空
self.setTitle("", for: .normal)
//开始把Label add Button
labelTimeS.text="\(self.count)s重新获取"
self.addSubview(labelTimeS)
//设置按钮背景色
self.backgroundColor=disableColor
iftimer!=nil{
timer.invalidate()
timer=nil
}
timer=Timer.scheduledTimer(timeInterval:1, target:self, selector:#selector(updateLabel), userInfo:nil, repeats:true)
timer.fire()
}
///停止更新
publicfuncstopCount(){
timer.invalidate()
labelTimeS.removeFromSuperview()
self.setTitle(normalText, for: .normal)
count=60
self.isEnabled=true
self.backgroundColor=normalColor
}
///每秒更新一次Label
@objcfileprivatefuncupdateLabel(){
count-=1;
ifcount<=0{
self.stopCount()
}else{
labelTimeS.text="\(self.count)s重新获取"
}
}
}
源代码链接:倒计时器按钮