美文网首页
(Swift) 短信验证码倒计时

(Swift) 短信验证码倒计时

作者: 布呐呐u | 来源:发表于2021-08-30 11:51 被阅读0次

一个可自定义的手机验证码倒计时组件

  • 支持后台持续计时
  • 点击后,DisEnabled,容错处理,不二次触发
  • 倒计时结束后,恢复Enabled,可再次触发
gif

Example

let countDownView = CCCountDownView()
countDownView.layer.cornerRadius = 8
countDownView.backgroundColor = .main
view.addSubview(countDownView)
countDownView.snp.makeConstraints() { make in
  make.center.equalToSuperview()
  make.size.equalTo(CGSize(width: 100, height: 50))
}

源码分享

//
//  CCCountDownView.swift
//  HelloSwift
//
//  Created by a51095 on 2021/7/15.
//

/// 倒计时总时长,默认10秒
private let defaultTotal: Int = 10
// eg: 使用方法,直接初始化CCCountDownView视图,添加到父视图上即可,支持后台持续计时;
final class CCCountDownView: UIControl {
    
    /// 倒计时总时长
    private var countDownTotal = defaultTotal
    /// 倒计时label
    private let countDownLabel = UILabel()
    /// 当前系统绝对时间,进入后台后,仍持续计时
    private var startTime: Int = 0
    /// 定时器对象
    private var taskTimer: DispatchSourceTimer?
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - 反初始化器
    deinit { print("CCCountDownView deinit~") }
    
    // MARK: - 初始化器
    init() {
        super.init(frame: .zero)
        self.setUI()
    }
    
    // MARK: - UI初始化
    private func setUI() {
        countDownLabel.text = "获取验证码"
        countDownLabel.textColor = .white
        countDownLabel.font = RegularFont(16)
        countDownLabel.textAlignment = .center
        addTarget(self, action: #selector(countDownDidSeleted), for: .touchUpInside)
        addSubview(countDownLabel)
        countDownLabel.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }
    }
    
    // MARK: - 重置数据
    private func resetData() {
        countDownTotal = defaultTotal
        isUserInteractionEnabled = false
        startTime = Int(CACurrentMediaTime())
    }
    
    // MARK: - 更新UI
    private func updateData() {
        // 获取剩余总时长
        self.countDownTotal = self.remainingTime()
        // 主线程刷新UI
        DispatchQueue.main.async {
            if self.countDownTotal > 0 {
                self.countDownLabel.text = self.countDownTotal.str
            }else {
                self.taskTimer?.cancel()
                self.countDownLabel.text = "重新获取"
                self.isUserInteractionEnabled = true
            }
        }
    }
    
    // MARK: - 开始倒计时
    @objc private func countDownDidSeleted() {
        resetData()
        taskTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue(label: "count_down_queue"))
        taskTimer?.schedule(deadline: .now(), repeating: .seconds(1), leeway: .seconds(0))
        taskTimer?.setEventHandler { self.updateData() }
        taskTimer?.resume()
    }
    
    // MARK: - 获取剩余总时长
    private func remainingTime() -> Int {
        defaultTotal - (Int(CACurrentMediaTime()) - startTime)
    }
}

更多组件 GitHub

相关文章

  • 79-Swift 之倒计时

    引言 倒计时常用于用户短信接收后,标示短信验证码的有效期。 Swift 中常见的倒计时有一下四个 1、Timer的...

  • Swift版的和Object-C版倒计时框架

    这是关于倒计时的封装,应用于:短信验证码倒计时以及其他的倒计时,代码已经传到github上,包含Swift版的和O...

  • iOS-UIButton倒计时

    一般倒计时的使用场景就两种:发送短信验证码倒计时广告页倒计时 一、发送短信验证码倒计时 这种情况下,正在倒计时的按...

  • 代码整理

    短信验证码加倒计时:public function sendmess(){require('Public/Send...

  • (Swift) 短信验证码倒计时

    一)使用场景 多用于首页登陆,手机验证码倒计时功能; 效果如下; 支持后台持续计时; 点击后,not Enable...

  • IOS倒计时按钮实现思路及Demo

    前言 最近因为项目中涉及到短信获取验证码功能,并且获取验证码按钮需要显示倒计时功能,同时当从获取验证码界面在倒计时...

  • 微信小程序 短信验证码

    短信验证码 倒计时90秒 归0后恢复 获取验证码 1.login.js 2.login.wxml

  • 短信验证码为何要设置读秒

    短信验证码一般是1分钟倒计时,倒计时结束可重新发送短信,倒计时的含义是告诉用户等待,不要离开或者进行其他操作,是一...

  • ios开发 倒计时Button实现(一)

    这个文章主要是针对 短信验证码 倒计时 思路如下:说到倒计时无非想到的是NSTimer倒计时,在Button触发点...

  • jquery 手机短信倒计时

    手机短信验证码倒计时,必须用button或者用input的type='button' 例如

网友评论

      本文标题:(Swift) 短信验证码倒计时

      本文链接:https://www.haomeiwen.com/subject/rdnniltx.html