怎么在iOS中使用UIKeyInput自定义密码输入框
这篇文章将为大家详细讲解有关怎么在iOS中使用UIKeyInput自定义密码输入框,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1.遵守UIKeyInput协议,实现文字输入
遵守UIKeyInput协议,实现协议中- (BOOL)hasText
、 - (void)insertText:(NSString *)text
、 - (void)deleteBackward
这三个方法。
这里方便阅读,单独抽离成为一个extension。
extensionCLPasswordInputView:UIKeyInput{ varhasText:Bool{ returntext.length>0 } funcinsertText(_text:String){ ifself.text.length<config.passwordNum{ letcs=NSCharacterSet.init(charactersIn:"0123456789").inverted letstring=text.components(separatedBy:cs).joined(separator:"") letbasicTest=text==string ifbasicTest{ self.text.append(text) delegate?.passwordInputViewDidChange(passwordInputView:self) ifself.text.length==config.passwordNum{ delegate?.passwordInputViewCompleteInput(passwordInputView:self) } setNeedsDisplay() } } } funcdeleteBackward(){ iftext.length>0{ text.deleteCharacters(in:NSRange(location:text.length-1,length:1)) delegate?.passwordInputViewDidChange(passwordInputView:self) } delegate?.passwordInputViewDidDeleteBackward(passwordInputView:self) setNeedsDisplay() } }
2.重写override func draw(_ rect: CGRect),绘制自定义UI
根据配置信息,以及当前文字输入,绘制自定义UI,这里讲绘制代码和一些基本代码写在一起,单独抽离成extension。
extensionCLPasswordInputView{ overridefuncbecomeFirstResponder()->Bool{ if!isShow{ delegate?.passwordInputViewBeginInput(passwordInputView:self) } isShow=true; returnsuper.becomeFirstResponder() } overridefuncresignFirstResponder()->Bool{ ifisShow{ delegate?.passwordInputViewEndInput(passwordInputView:self) } isShow=false returnsuper.resignFirstResponder() } varkeyboardType:UIKeyboardType{ get{ return.numberPad } set{ } } overridevarcanBecomeFirstResponder:Bool{ returntrue } overridevarcanResignFirstResponder:Bool{ returntrue } overridefunctouchesBegan(_touches:Set<UITouch>,withevent:UIEvent?){ super.touchesBegan(touches,with:event) if!isFirstResponder{ _=becomeFirstResponder() } } funcupdateWithConfig(config:((CLPasswordInputViewConfigure)->Void)?)->Void{ config?(self.config) backgroundColor=self.config.backgroundColor setNeedsDisplay() } overridefunclayoutSubviews(){ super.layoutSubviews() setNeedsDisplay() } overridefuncdraw(_rect:CGRect){ letheight=rect.size.height letwidth=rect.size.width letsquareWidth=min(max(min(height,config.squareWidth),config.pointRadius*4),height) letpointRadius=min(config.pointRadius,squareWidth*0.5)*0.8 letmiddleSpace=CGFloat(width-CGFloat(config.passwordNum)*squareWidth)/CGFloat(CGFloat(config.passwordNum-1)+config.spaceMultiple*2) letleftSpace=middleSpace*config.spaceMultiple lety=(height-squareWidth)*0.5 letcontext=UIGraphicsGetCurrentContext() foriin0..<config.passwordNum{ context?.addRect(CGRect(x:leftSpace+CGFloat(i)*squareWidth+CGFloat(i)*middleSpace,y:y,width:squareWidth,height:squareWidth)) context?.setLineWidth(1) context?.setStrokeColor(config.rectColor.cgColor) context?.setFillColor(config.rectBackgroundColor.cgColor) } context?.drawPath(using:.fillStroke) context?.setFillColor(config.pointColor.cgColor) foriin0..<text.length{ context?.addArc(center:CGPoint(x:leftSpace+CGFloat(i+1)*squareWidth+CGFloat(i)*middleSpace-squareWidth*0.5,y:y+squareWidth*0.5),radius:pointRadius,startAngle:0,endAngle:.pi*2,clockwise:true) context?.drawPath(using:.fill) } } }
3.使用配置类,来统一接口,生成基本配置信息
自定义UI过程中,对于颜色,间隙,原点大小等,都需要留出接口,方便外部修改。一大堆属性,对于使用者而言,并不友好,因为他并不知道哪些属性是必须的,哪些是非必须的,为了让使用者方便使用,这里单独抽离出一个配置信息类,在内部实现基础配置,同时给出方法,让外部可以修改某些属性。
classCLPasswordInputViewConfigure:NSObject{ ///密码的位数 varpasswordNum:UInt=6 ///边框正方形的大小 varsquareWidth:CGFloat=50 ///黑点的半径 varpointRadius:CGFloat=18*0.5 ///边距相对中间间隙倍数 varspaceMultiple:CGFloat=5; ///黑点颜色 varpointColor:UIColor=UIColor.black ///边框颜色 varrectColor:UIColor=UIColor.lightGray ///输入框背景颜色 varrectBackgroundColor:UIColor=UIColor.white ///控件背景颜色 varbackgroundColor:UIColor=UIColor.white classfuncdefaultConfig()->CLPasswordInputViewConfigure{ letconfigure=CLPasswordInputViewConfigure() returnconfigure } }
外部修改配置的方法,使用闭包,将基本配置回调到外部,同时在外部修改这些属性后,对内部UI进行刷新。
funcupdateWithConfig(config:((CLPasswordInputViewConfigure)->Void)?)->Void{ config?(self.config) backgroundColor=self.config.backgroundColor setNeedsDisplay() }
4.使用代理来管理各种输入相关的事件
这里单独创建一个协议,管理各种输入事件,同时通过extension实现这些协议,这样外部就可以选择性的实现这些协议,而不是必须实现。
protocolCLPasswordInputViewDelegate{ ///输入改变 funcpasswordInputViewDidChange(passwordInputView:CLPasswordInputView)->Void ///点击删除 funcpasswordInputViewDidDeleteBackward(passwordInputView:CLPasswordInputView)->Void ///输入完成 funcpasswordInputViewCompleteInput(passwordInputView:CLPasswordInputView)->Void ///开始输入 funcpasswordInputViewBeginInput(passwordInputView:CLPasswordInputView)->Void ///结束输入 funcpasswordInputViewEndInput(passwordInputView:CLPasswordInputView)->Void } extensionCLPasswordInputViewDelegate{ ///输入改变 funcpasswordInputViewDidChange(passwordInputView:CLPasswordInputView)->Void{ } ///点击删除 funcpasswordInputViewDidDeleteBackward(passwordInputView:CLPasswordInputView)->Void{ } ///输入完成 funcpasswordInputViewCompleteInput(passwordInputView:CLPasswordInputView)->Void{ } ///开始输入 funcpasswordInputViewBeginInput(passwordInputView:CLPasswordInputView)->Void{ } ///结束输入 funcpasswordInputViewEndInput(passwordInputView:CLPasswordInputView)->Void{ } }
关于怎么在iOS中使用UIKeyInput自定义密码输入框就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
推荐阅读
-
ios14系统怎么用nfc(ios 14新增的nfc功能怎么用)
ios14新增的nfc功能怎么用?1.打开iPhone后,选择手机的[设置]图标。2.进入后,点击【通用】选项进入。3.单击并选...
-
微信小程序iOS端怎么暂停animated动画
-
iOS中多线程的示例分析
-
ios启动私有链查询区块信息的方法是什么
ios启动私有链查询区块信息的方法是什么本篇内容介绍了“ios启动...
-
正则表达式在ios中怎么用
正则表达式在ios中怎么用这篇文章主要为大家展示了“正则表达式在i...
-
如何进行iOS中的信息泄露漏洞CVE-2020-9964分析
如何进行iOS中的信息泄露漏洞CVE-2020-9964分析今天就...
-
iOS中怎么删除无用的类
本篇文章给大家分享的是有关iOS中怎么删除无用的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话...
-
iOS中怎么实现一个序列动画
这篇文章给大家介绍iOS中怎么实现一个序列动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。UIViewPr...
-
iOS中怎么利用MVVM实现路由
iOS中怎么利用MVVM实现路由,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更...
-
iOS中怎么判断当前网络环境
本篇文章为大家展示了iOS中怎么判断当前网络环境,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所...