iOS 开发中有很多人可能会用到输入身份证的业务,但是系统提供的并没有这个接盘的类型,所以这里需要我们自定义键盘;
自定义键盘目前LZ了解的是两种方法:第一种是在系统的键盘上添加一个X;
第二种就是自己写一个View进行开发;
这里使用的是第二种方法自定义身份证键盘:
1.我们首先创建一个继承与UIView的类文件:DZKeyBoard (文件名字)里面使用枚举来列出我们键盘的类型
typedef enum : NSInteger {
DZKeyBoardNumber = 0, //纯数字键盘
DZKeyBoardIDCard, //身份证号键盘
DZKeyBoardTyping, //正常26键盘
} DZKeyBoardStyle;
之后我们就要写一个初始化方法了,外面调用需要传入一个枚举类型
> -(instancetype)initWithFrame:(CGRect)frame KeyboardType:(DZKeyBoardStyle)KeyboardType;
方法实现如下:
-(instancetype)initWithFrame:(CGRect)frame KeyboardType:(DZKeyBoardStyle)KeyboardType{
self = [super initWithFrame:frame];
if (self) {
[self CreactkeyBoard:KeyboardType];
}
return self;
}
-(void)CreactkeyBoard:(DZKeyBoardStyle)KeyboardType{
switch (KeyboardType) {
case DZKeyBoardNumber:{ //纯数字键盘
[self CreactDZKeyBoardNumber:self.numberArray];
}
break;
case DZKeyBoardIDCard:{ //身份证号键盘
}
break;
case DZKeyBoardTyping:{ //打字键盘
}
break;
default:
break;
}
}
-(void)CreactDZKeyBoardNumber:(NSArray *)array{
NSLog(@"纯数字======%@======%lu",array,(unsigned long)array.count);
NSInteger index = 0;
for (NSInteger i = 0; i < 4; i++) { //先遍历行 x
for (NSInteger j = 0; j < 3; j++) { //在遍历列 y
UIButton *numberBtn = [UIButton buttonWithType:UIButtonTypeCustom];
numberBtn.backgroundColor = [UIColor colorWithRed:245 green:245 blue:245 alpha:1];
numberBtn.frame = CGRectMake(kWidth/3*j, kWidth/3/2*i, kWidth/3, kWidth/3/2);
[numberBtn setTitle:_numberArray[index] forState:UIControlStateNormal];
numberBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
numberBtn.tag = 1000+index;
[numberBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[numberBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self drawActionWithBtn:numberBtn];
[numberBtn addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:numberBtn];
index++;
}
}
}
记得要写一个键盘数组:
-(NSArray *)numberArray{
if (!_numberArray) {
_numberArray = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", @"X",@"0",@"删除"];
}
return _numberArray;
}
如果要求要高的,我们可以使用这个划线方法,这样子看起来效果绝对会很美:
- (void)drawActionWithBtn:(UIButton *)sender
{
UIBezierPath *bottomPath = [UIBezierPath bezierPath];
if (sender.tag < 1009) {
[bottomPath moveToPoint:CGPointMake(0, CGRectGetHeight(sender.frame))];
[bottomPath addLineToPoint:CGPointMake(CGRectGetWidth(sender.frame), CGRectGetHeight(sender.frame))];
[bottomPath addLineToPoint:CGPointMake(CGRectGetWidth(sender.frame), 0)];
if (sender.tag < 1003) {
[bottomPath addLineToPoint:CGPointMake(0, 0)];
}
}else{
[bottomPath moveToPoint:CGPointMake(CGRectGetWidth(sender.frame), 0)];
[bottomPath addLineToPoint:CGPointMake(CGRectGetWidth(sender.frame), CGRectGetHeight(sender.frame))];
}
CAShapeLayer *layer = [CAShapeLayer layer];
layer.bounds = sender.bounds;
layer.position = CGPointMake(sender.frame.size.width/2, sender.frame.size.height/2);
layer.strokeColor = [UIColor colorWithRed:240/255.0 green:246/255.0 blue:243/255.0 alpha:1].CGColor;
layer.fillColor = [UIColor clearColor].CGColor;
layer.path = bottomPath.CGPath;
[sender.layer addSublayer:layer];
}
接下来就是外面的调用了
-(UITextField *)dz_textfield{
if (!_dz_textfield) {
_dz_textfield = [DZUITextField DZTextFieldFrame:CGRectMake(50, 100, 300, 40) BorderStyle:UITextBorderStyleRoundedRect placeholder:@"请输入密码" clearButtonModel:UITextFieldViewModeAlways];
_dz_textfield.tintColor = [UIColor redColor];
[_dz_textfield.inputView removeFromSuperview];
_dz_textfield.inputView = self.dz_keyBoard;
_dz_textfield.delegate = self;
}
return _dz_textfield;
}
-(DZKeyBoard *)dz_keyBoard{
if (!_dz_keyBoard) {
_dz_keyBoard = [[DZKeyBoard alloc]initWithFrame:CGRectMake(0, KHEIGHT-KWIDTH/3/2*4, KWIDTH, KWIDTH/3/2*4) KeyboardType:DZKeyBoardNumber];
_dz_keyBoard.Keydelegate = self;
_dz_keyBoard.hidden = YES;
_dz_keyBoard.backgroundColor = [UIColor clearColor];
}
return _dz_keyBoard;
}
这里我们要先初始下我们的键盘和一个输入框,这个时候你会发现,键盘出来了,但是没有光标,所以我们要拿到光标,并且还要把系统的键盘给隐藏掉,这个时候我们可以移除系统的键盘,并且刷新键盘的inputView;
- (void)dzBackValueWithButton:(UIButton *)sender{
[sender setHighlighted:YES];
if (!(sender.tag == 1011)) {
_dz_textfield.text = [NSString stringWithFormat:@"%@%@", _dz_textfield.text, sender.titleLabel.text];
}else{
if ([_dz_textfield.text length] != 0) {
[_dz_textfield deleteBackward];
}else{
_dz_keyBoard.hidden = YES;
[_dz_textfield resignFirstResponder];
}
}
[self.dz_textfield reloadInputViews];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
_dz_keyBoard.hidden = YES;
[_dz_textfield resignFirstResponder];
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
_dz_keyBoard.hidden = NO;
[_dz_textfield.inputView removeFromSuperview];
[self.dz_textfield reloadInputViews];
return YES;
}
到这里就全部结束了,代码地址:https://github.com/BenHuGZX/DZKeyBoard
@end