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

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")

}

}

Swift 短信验证码相关推荐

  1. android 短信验证码的实现

    公司用的短信验证码是Mob.com 网址:http://www.mob.com 进入网站 注册登录之后 进入后在上面有应用是让选择android还是ios 之类的,点击下载SDK --选择免费短信验证 ...

  2. python控制手机发短信_python-在python3中使用容联云通讯发送短信验证码

    2020-08-15更新 今天进容联云官网发现其已经更新了最新版的Python SDK,可以直接 pip install ronglian_sms_sdk 即可安装使用,具体新的使用方法可以查看官网案 ...

  3. Django博客系统(短信验证码)

    1. 容联云短信平台操作 1.容联云官网 容联云通讯网址:容联云通讯_短信平台.手机验证码.语音验证码.IM即时通讯.云呼叫系统等互联网通信服务 注册并登陆 2.容联云管理控制台 3.添加容联云测试手 ...

  4. 美多商城之验证码(短信验证码2)

    二.短信验证码 2.3 短信验证码后端逻辑 1. 短信验证码接口设计 1.请求方式 选项 方案 请求方法 GET 请求地址 /sms_codes/(?P<mobile>1[3-9]\d{9 ...

  5. 美多商城之验证码(短信验证码1)

    二.短信验证码 2.1 短信验证码逻辑分析 知识要点 保存短信验证码是为注册做准备的. 为了避免用户使用图形验证码恶意测试,后端提取了图形验证码后,立即删除图形验证码. Django不具备发送短信的功 ...

  6. 5.Spring Security 短信验证码登录

    Spring Security 短信验证码登录 在 Spring Security 添加图形验证码一节中,我们已经实现了基于 Spring Boot + Spring Security 的账号密码登录 ...

  7. 怎么一个好的短信验证码接口接入到自己的企业网站和APP程序当中选择

    文章来源:http://www.4006026717.com 短信验证码平台太多也是一种幸福的烦恼,毕竟好东西太多不知道该如何选也是很麻烦的.那么,如何选择一个好用的平台呢?下面小编为大家提供几个参考 ...

  8. javca中redis获取value_接口测试:如何从redis中获取短信验证码

    问题:重置密码接口.注册接口的入参需要用到短信验证码接口发出的短信,短信验证码存到了Redis里.如何从Redis中取出? 解决办法:(首先鸣谢开发小伙伴薛同学!) 薛同学给了Redis的IP地址.端 ...

  9. 注册app短信验证平台_短信验证码平台能免费测试吗?怎么测试?

    短信验证码的运用在用户注册.用户登录.忘记密码.支付确认.登录异常等等场景,可以说很多企业/网站都会需要用到短信验证码.那对于有短信验证码需求的企业来说,在挑选短信验证码平台时,比较关心的一点就是短信 ...

最新文章

  1. 腾讯广告广点通API接入文档(Android)
  2. com.android.vivi删除,vivi命令详解
  3. heartbeat之part1
  4. 对话阿里云Alex Chen:下一代存储应如何面对云转型?
  5. 【linux】kill命令信号总结
  6. VSCode 1.35 发布,新的图标,支持远程开发
  7. DotNetBar 6.2
  8. java中Matcher和pattern的使用
  9. Java邮件发送(使用javaMail包)
  10. (转)十分钟了结MySQL information_schema
  11. win2012R2无法打开匿名级安全令牌,安装.net 3.5
  12. BF,KMP算法(万字图文详解)
  13. 苹果台式电脑怎么使用计算机,MAC电脑连接台式电脑显示器怎么操作
  14. python换照片底色_详解Python给照片换底色(蓝底换红底)
  15. 二阶魔方入门玩法教程
  16. 【计算机毕业设计】188校园商铺管理系统设计与实现
  17. 猜客魔盒二次开发盲盒APP趣味功能讲解(一)
  18. Iphone开发(七)date picker 和 picker view,较复杂的控件
  19. Java 以任意数量空格分割字符串方式
  20. 需求的获取:需求调研中的5W+1H定律

热门文章

  1. blender手册快捷键和操作技巧五
  2. 红蓝对抗-红队攻防全流程解析
  3. 【前端优化之渲染优化】大屏android手机动画丢帧的背后
  4. 从世界各地测试网站访问速度
  5. python去除图片水印的代码
  6. 为什么要使用多线程技术
  7. 华为再次强调!鸿蒙 OS 不是安卓和 iOS 的拷贝,今年目标覆盖 3-4 亿台设备
  8. 项目启动报错Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error
  9. .NET WPF教程(21)——DataGrid示例
  10. oracle 列转行-很慢-优化--ok