效果图
issue: 在定时器中不断刷新设置button.setTitle时,button会出现闪烁的现象
解决:同时设定setTitle 和titleLabel.text即可
sender.titleLabel?.text = "\(seconds)s后重新发送"
sender.setTitle("\(seconds)s后重新发送", forState: .Normal)
获取验证码倒计时
GCD方式 简洁
private func gcdWithGetCode(sender: UIButton){
sender.userInteractionEnabled = false
sender.styleWith(.Normal, titleColor: UIColor.orangeColor(), fontSize: 11)
var seconds = 10
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, dispatch_walltime(nil, 0), 1 * NSEC_PER_SEC, 0)
dispatch_source_set_event_handler(timer) {
if seconds <= 0{
// 取消timer
dispatch_source_cancel(timer)
dispatch_async(dispatch_get_main_queue(), {
sender.userInteractionEnabled = true
sender.setTitle("获取验证码", forState: .Normal)
sender.styleWith(.Normal, titleColor: UIColor.blackColor(), fontSize: 14)
})
}
else{
dispatch_async(dispatch_get_main_queue(), {
sender.titleLabel?.text = "\(seconds)s后重新发送"
sender.setTitle("\(seconds)s后重新发送", forState: .Normal)
})
seconds -= 1
}
}
// 开启timer
dispatch_resume(timer)
}
NSTimer方式 简单
private func nstimerWithGetCode(sender: UIButton){
sender.userInteractionEnabled = false
let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(LoginInputView.refreshValicodeBtnTitle(_:)), userInfo: sender, repeats: true)
sender.styleWith(.Normal, titleColor: UIColor.orangeColor(), fontSize: 11)
timer.fire()
}
// refresh ui
var seconds = 10
func refreshValicodeBtnTitle(timer: NSTimer){
let sender = timer.userInfo as? UIButton
sender?.titleLabel?.text = "\(seconds)s后重新发送"
sender?.setTitle("\(seconds)s后重新发送", forState: .Normal)
if seconds <= 0 {
seconds = 10
sender?.userInteractionEnabled = true
sender?.setTitle("获取验证码", forState: .Normal)
sender?.styleWith(.Normal, titleColor: UIColor.blackColor(), fontSize: 14)
timer.invalidate()
}
seconds -= 1
}