Swift 短信验证码
项目中直接换掉类名称直接可以使用
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 短信验证码相关推荐
- android 短信验证码的实现
公司用的短信验证码是Mob.com 网址:http://www.mob.com 进入网站 注册登录之后 进入后在上面有应用是让选择android还是ios 之类的,点击下载SDK --选择免费短信验证 ...
- python控制手机发短信_python-在python3中使用容联云通讯发送短信验证码
2020-08-15更新 今天进容联云官网发现其已经更新了最新版的Python SDK,可以直接 pip install ronglian_sms_sdk 即可安装使用,具体新的使用方法可以查看官网案 ...
- Django博客系统(短信验证码)
1. 容联云短信平台操作 1.容联云官网 容联云通讯网址:容联云通讯_短信平台.手机验证码.语音验证码.IM即时通讯.云呼叫系统等互联网通信服务 注册并登陆 2.容联云管理控制台 3.添加容联云测试手 ...
- 美多商城之验证码(短信验证码2)
二.短信验证码 2.3 短信验证码后端逻辑 1. 短信验证码接口设计 1.请求方式 选项 方案 请求方法 GET 请求地址 /sms_codes/(?P<mobile>1[3-9]\d{9 ...
- 美多商城之验证码(短信验证码1)
二.短信验证码 2.1 短信验证码逻辑分析 知识要点 保存短信验证码是为注册做准备的. 为了避免用户使用图形验证码恶意测试,后端提取了图形验证码后,立即删除图形验证码. Django不具备发送短信的功 ...
- 5.Spring Security 短信验证码登录
Spring Security 短信验证码登录 在 Spring Security 添加图形验证码一节中,我们已经实现了基于 Spring Boot + Spring Security 的账号密码登录 ...
- 怎么一个好的短信验证码接口接入到自己的企业网站和APP程序当中选择
文章来源:http://www.4006026717.com 短信验证码平台太多也是一种幸福的烦恼,毕竟好东西太多不知道该如何选也是很麻烦的.那么,如何选择一个好用的平台呢?下面小编为大家提供几个参考 ...
- javca中redis获取value_接口测试:如何从redis中获取短信验证码
问题:重置密码接口.注册接口的入参需要用到短信验证码接口发出的短信,短信验证码存到了Redis里.如何从Redis中取出? 解决办法:(首先鸣谢开发小伙伴薛同学!) 薛同学给了Redis的IP地址.端 ...
- 注册app短信验证平台_短信验证码平台能免费测试吗?怎么测试?
短信验证码的运用在用户注册.用户登录.忘记密码.支付确认.登录异常等等场景,可以说很多企业/网站都会需要用到短信验证码.那对于有短信验证码需求的企业来说,在挑选短信验证码平台时,比较关心的一点就是短信 ...
最新文章
- 腾讯广告广点通API接入文档(Android)
- com.android.vivi删除,vivi命令详解
- heartbeat之part1
- 对话阿里云Alex Chen:下一代存储应如何面对云转型?
- 【linux】kill命令信号总结
- VSCode 1.35 发布,新的图标,支持远程开发
- DotNetBar 6.2
- java中Matcher和pattern的使用
- Java邮件发送(使用javaMail包)
- (转)十分钟了结MySQL information_schema
- win2012R2无法打开匿名级安全令牌,安装.net 3.5
- BF,KMP算法(万字图文详解)
- 苹果台式电脑怎么使用计算机,MAC电脑连接台式电脑显示器怎么操作
- python换照片底色_详解Python给照片换底色(蓝底换红底)
- 二阶魔方入门玩法教程
- 【计算机毕业设计】188校园商铺管理系统设计与实现
- 猜客魔盒二次开发盲盒APP趣味功能讲解(一)
- Iphone开发(七)date picker 和 picker view,较复杂的控件
- Java 以任意数量空格分割字符串方式
- 需求的获取:需求调研中的5W+1H定律
热门文章
- blender手册快捷键和操作技巧五
- 红蓝对抗-红队攻防全流程解析
- 【前端优化之渲染优化】大屏android手机动画丢帧的背后
- 从世界各地测试网站访问速度
- python去除图片水印的代码
- 为什么要使用多线程技术
- 华为再次强调!鸿蒙 OS 不是安卓和 iOS 的拷贝,今年目标覆盖 3-4 亿台设备
- 项目启动报错Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error
- .NET WPF教程(21)——DataGrid示例
- oracle 列转行-很慢-优化--ok