很早之前写的一个验证码输入控件,一直没时间整理一下,最近终于抽出时间可以做个分享。
先上图:
功能介绍
功能比较简单:包括顺序输入及删除,点击验证码输入部分弹收起键盘。暂未实现随意输入及删除验证码。
核心代码
使用部分:
_codeView = [[VerifyCodeView alloc]initWithFrame:CGRectZero withCodeLength:4];
__weak __typeof(self) weakSelf = self;
_codeView.inputTextBlock = ^(NSString *text) {
if ([text.lowercaseString isEqualToString:weakSelf.codeLabel.text.lowercaseString]) {
[weakSelf alertTitle:@"校验成功"];
}else{
[weakSelf alertTitle:@"校验失败"];
}
};
[self.view addSubview:_codeView];
实现原理:
for (int i = 0; i < self.maxCodeLength; i++) {/*创建多个textFiled实现多个验证码输入*/
VerifyCodeTextField *textfield = [[VerifyCodeTextField alloc]init];
textfield.tag = textFieldTag + i;
textfield.delegate = self;
textfield.deleteDelegate = self;
...
}
遇到的问题:
创建多个textfield,当删除输入码时,并不能从当前textfield回到上一个textfield中。
解决办法:自定义textfield继承UITextField,重写deleteBackward方法。
@implementation VerifyCodeTextField
- (void)deleteBackward{
[super deleteBackward];
if ([self.deleteDelegate respondsToSelector:@selector(verifyCodeTextFieldDelete:)]) {
[self.deleteDelegate verifyCodeTextFieldDelete:self];
}
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
return nil;
}
实现代理:
- (void)verifyCodeTextFieldDelete:(UITextField *)textField{/*删除验证码代理方法*/
[self textFieldDeleteInputText:textField];
}
详见demo