项目中直接换掉类名称直接可以使用
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")
}
}