iOS-swift-获取验证码倒计时+issue修复

效果图

iOS-swift-获取验证码倒计时+issue修复_第1张图片
QQ20160712-0.png
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
    }

你可能感兴趣的:(iOS-swift-获取验证码倒计时+issue修复)