Swift 短信验证码

10 篇文章 0 订阅
9 篇文章 0 订阅

项目中直接换掉类名称直接可以使用

import UIKit

class CodeTextField: UITextField {

    var deleteBackwardHandler: (()->Void)?

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

        UIMenuController.shared.isMenuVisible = false

        

        return false

    }

    override func deleteBackward() {

        deleteBackwardHandler?()

    }

}

class VerificationCodeView: UIView, UITextFieldDelegate {

   

    var textViewComplete: ((_ text: String)->Void)?

    private(set) var text: String?

    

    

    var isSecureTextEntry: Bool = false

    private var count: Int = 4

    private var spacing: CGFloat = 8

    lazy var textField: HZ_CodeTextField = HZ_CodeTextField()

    private lazy var dotView: [UIView] = []

    private lazy var labels: [UILabel] = []

    override init(frame: CGRect) {

        super.init(frame: frame)

        addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(becomeFirstResponder)))

        initUI()

    }

    

    

    private func initUI() {

        addSubview(textField)

        textField.deleteBackwardHandler = { [weak self] in

            self?.deleteBackward()

        }

        textField.tintColor = .clear

        textField.delegate = self

        textField.keyboardType = .numberPad

        var width = frame.size.height

        var spacing = (frame.size.width - width*CGFloat(count))/CGFloat(count-1)

        if self.spacing != nil {

            spacing = self.spacing

            width = (frame.size.width - spacing*CGFloat(count-1))/CGFloat(count)

       }

        for i in 0..<count {

            let label = UILabel()

            label.font = UIFont.init(name: "PingFangSC-Semibold", size: 26)

            label.textColor = QMColor_333333

            label.textAlignment = .center

            label.frame = CGRect.init(x: (width+spacing)*CGFloat(i), y: 0, width: width, height: frame.size.height)

            addSubview(label)

            label.layer.masksToBounds = true

            label.layer.cornerRadius = 8

            label.backgroundColor = UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.04)

            

            labels.append(label)

        }

        setTextFieldFrame()

    }

    

    private var highlightedIndex: Int = -1

    

    private func deleteBackward(){

        let length = self.text?.count ?? 0

        if length > 0 {

            let index = max(length-2, 0)

            self.text = self.text?[0...index]

            if length == 1 {

                self.text = ""

            }

            self.highlightedIndex = max((self.text?.count ?? 0)-1, 0)

            if self.isSecureTextEntry {

                self.dotView[length-1].isHidden = true

            }else{

                self.labels[length-1].text = ""

            }

            setTextFieldFrame()

        }

    }

    func cleanText(){

        self.text = ""

        self.textField.text = ""

        for label in self.labels {

            label.text = "";

        }

        for dot in self.dotView {

            dot.isHidden = true

        }

        self.highlightedIndex = -1

    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        var code = string

        if code.count >= self.count{

            code = code[0...(self.count-1)]

            if self.isSecureTextEntry {

                for dot in self.dotView {

                    dot.isHidden = false

                }

            }else{

                for (i,label) in self.labels.enumerated() {

                    label.text = code[i...i]

                }

            }

            self.highlightedIndex = self.count-1

        }else{

            if code.count > 0, (self.text?.count ?? 0) < self.count {

                self.text = (self.text ?? "") + code

                self.highlightedIndex = self.text?.count ?? 0

                if self.isSecureTextEntry {

                    self.dotView[self.highlightedIndex-1].isHidden = false

                }else{

                    self.labels[self.highlightedIndex-1].text = code

                }

            }

        }

        setTextFieldFrame()

        if self.text?.count ?? 0 == self.count {

            _ = resignFirstResponder()

        }

        return false

    }

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

        self.highlightedIndex = max((self.text?.count ?? 0)-1, 0)

        return true

    }

    func textFieldDidEndEditing(_ textField: UITextField) {

        self.highlightedIndex = -1

        if self.text?.count ?? 0 == self.count {

            self.textViewComplete?(self.text ?? "")

        }

        

    }

    private func setTextFieldFrame(){

        let x = self.labels[max(min(self.highlightedIndex, self.count-1), 0)].centerX

        textField.frame = CGRect.init(x: x, y: 0, width: self.frame.size.width-x, height: self.frame.size.height)

    }

    override func becomeFirstResponder() -> Bool {

        _ = self.textField.becomeFirstResponder()

        self.highlightedIndex = max((self.text?.count ?? 0)-1, 0)

        return super.becomeFirstResponder()

    }

    

    override func resignFirstResponder() -> Bool {

        _ = self.textField.resignFirstResponder()

        self.highlightedIndex = -1

        return super.resignFirstResponder()

    }

    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iOS上架APP技术交流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值