swift中,之前都是通过额外的设置去实现点击发送验证码按钮后的倒计时。
现在去看看是否方便扩展UIButton
去实现,点击后,就自动倒计时
然后可以设置停止倒计时
的按钮。
最后,自己实现了对应的代码:
<code>/***************************************************************************
* CountdownButton.swift
***************************************************************************/
let CountdownButtonAutoStartCounddown:Bool = true
let CountdownButtonNormalTitle:String = "发送验证码"
let CountdownButtonTotalNum:Int = 60
let CountdownButtonDisabledTitleColor:UIColor = UIColor.grayColor()
//let CountdownButtonDisabledTitleFormat:String = "发送验证码(%d秒)"
let CountdownButtonDisabledTitleFormat:String = "重新发送(%d秒)"
class CountdownButton: UIButton {
//class CountdownButton: CommonButton {
var autoStartCounddown:Bool
var normalTitle:String
var totalCountdownNum:Int
var disabledTitleColor:UIColor
var disabledTitleFormat:String
var countdownTimer:NSTimer
var countdownCurNum:Int
override init(frame: CGRect) {
self.autoStartCounddown = CountdownButtonAutoStartCounddown
self.normalTitle = CountdownButtonNormalTitle
self.totalCountdownNum = CountdownButtonTotalNum
self.disabledTitleColor = CountdownButtonDisabledTitleColor
self.disabledTitleFormat = CountdownButtonDisabledTitleFormat
self.countdownCurNum = 0
self.countdownTimer = NSTimer()
super.init(frame: frame)
if self.autoStartCounddown {
self.addTarget(self, action: #selector(self.startCountdown), forControlEvents: UIControlEvents.TouchUpInside)
}
self.setTitle(self.normalTitle, forState:UIControlState.Normal)
}
convenience init(normalTitle:String, autoStartCounddown:Bool = CountdownButtonAutoStartCounddown, totalCountdownNum:Int = CountdownButtonTotalNum, countingDownTitleColor:UIColor = CountdownButtonDisabledTitleColor,countingDownTitleFormat:String = CountdownButtonDisabledTitleFormat) {
self.init(frame: CGRectZero)
self.autoStartCounddown = autoStartCounddown
if !self.autoStartCounddown {
self.removeTarget(self, action: #selector(self.startCountdown), forControlEvents: UIControlEvents.TouchUpInside)
}
self.normalTitle = normalTitle
self.setTitle(self.normalTitle, forState:UIControlState.Normal)
self.totalCountdownNum = totalCountdownNum
self.disabledTitleColor = countingDownTitleColor
self.setTitleColor(self.disabledTitleColor, forState: UIControlState.Disabled)
self.disabledTitleFormat = countingDownTitleFormat
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func startCountdown() {
gLog.debug("")
self.countdownCurNum = self.totalCountdownNum
updateCountdownLabel()
self.countdownTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:#selector(self.updateCountdown), userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(self.countdownTimer, forMode: NSRunLoopCommonModes)
}
func updateCountdown() {
gLog.debug("self.countdownCurNum=\(self.countdownCurNum)")
self.countdownCurNum -= 1
if self.countdownCurNum <= 0 {
self.countdownTimer.invalidate()
self.countdownCurNum = 0
}
updateCountdownLabel()
}
func updateCountdownLabel(){
gLog.debug("self.countdownCurNum=\(self.countdownCurNum)")
dispatchMain_async({
if self.countdownCurNum == 0 {
self.setTitle(self.normalTitle, forState:UIControlState.Normal)
self.enabled = true
}else if self.countdownCurNum > 0 {
self.setTitle(String(format: self.disabledTitleFormat, self.countdownCurNum), forState:UIControlState.Disabled)
self.enabled = false
}
// self.updateSmsCodeButtonUI()
})
}
func stopCountdown(){
gLog.debug("stopCountdown: self.countdownCurNum=\(self.countdownCurNum)")
self.countdownTimer.invalidate()
self.countdownCurNum = 0
updateCountdownLabel()
}
// func updateSmsCodeButtonUI(){
// if self.enabled {
// self.backgroundColor = UIColor.whiteColor()
// self.layer.borderColor = ColorButtonBackgroud.CGColor
// self.setTitleColor(ColorButtonBackgroud, forState: UIControlState.Normal)
// } else {
// self.backgroundColor = UIColor.clearColor()
// self.layer.borderColor = ColorTextFieldBorderGray.CGColor
// self.setTitleColor(ColorTextFieldPlaceholderGray, forState: UIControlState.Disabled)
// }
// }
}
调用:
/***************************************************************************
* CountdownButton demo
***************************************************************************/
//let getSmsCodeButton:CountdownButton = CountdownButton(normalTitle: "发送验证码", autoStartCounddown: false)
let getSmsCodeButton:CountdownButton = CountdownButton(normalTitle: "发送验证码")
print("getSmsCodeButton=\(getSmsCodeButton)")
// self.addSubview(self.getSmsCodeButton)
//if autoStartCounddown = true, then not need this
getSmsCodeButton.startCountdown()
getSmsCodeButton.stopCountdown()
</code>最新最全代码详见:
github中的源码:
和:
转载请注明:在路上 » [已解决]swift去实现一个发送验证码按钮且支持点击后自动倒计时