怎么在iOS中使用UIKeyInput自定义密码输入框

这篇文章将为大家详细讲解有关怎么在iOS中使用UIKeyInput自定义密码输入框,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1.遵守UIKeyInput协议,实现文字输入

怎么在iOS中使用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自定义密码输入框就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2021-04-15 01:56:24
收藏
分享
海报
0 条评论
164
上一篇:怎么在JavaScript中使用canvas实现一个旋转星空效果 下一篇:使用Vue.js怎么实现一个可排序的表格组件
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码