有的app要求校验身份证号,键盘只能输入数字和X符号,所以要定制键盘,目前有两种方法。
//initalize the first textField self.idCardNumberSystemModify = [[UITextField alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2 - 140, 100, 280, 30)]; [_idCardNumberSystemModify setBorderStyle:UITextBorderStyleRoundedRect]; [_idCardNumberSystemModify setKeyboardType:UIKeyboardTypeNumberPad]; [_idCardNumberSystemModify setTextAlignment:UITextAlignmentLeft]; [_idCardNumberSystemModify setPlaceholder:@"input ID with modified keyboard"]; [_idCardNumberSystemModify setClearButtonMode:UITextFieldViewModeWhileEditing]; [self.view addSubview:self.idCardNumberSystemModify]; [_idCardNumberSystemModify setDelegate:self];添加XButton以及事件响应,并且在编辑框结束编辑时移除
#pragma mark - modify method:add button and callback - (void)addXButtonToKeyboard { [self addXButtonToKeyboardWithSelector:@selector(onXButtonClicked) normalImg:[UIImage imageNamed:@"Xbutton_normal.png"] highlightImg:[UIImage imageNamed:@"Xbutton_highlight.png"]]; } - (void)addXButtonToKeyboardWithSelector:(SEL)button_callback normalImg:(UIImage *)normal_icon highlightImg:(UIImage *)highlight_icon { //create the XButton UIButton *xButton = [UIButton buttonWithType:UIButtonTypeCustom]; xButton.tag = XBUTTON_MODIFY_TAG; xButton.frame = CGRectMake(0, 0, KEY_WIDTH, KEY_HEIGHT); //the half size of the original image xButton.adjustsImageWhenDisabled = NO; [xButton setImage:normal_icon forState:UIControlStateNormal]; [xButton setImage:highlight_icon forState:UIControlStateHighlighted]; [xButton addTarget:self action:button_callback forControlEvents:UIControlEventTouchUpInside]; //add to keyboard int cnt = [[UIApplication sharedApplication] windows].count; UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:cnt - 1]; xButton.frame = CGRectMake(0, keyboardWindow.frame.size.height - KEY_HEIGHT, KEY_WIDTH, KEY_HEIGHT); [keyboardWindow addSubview:xButton]; } //when XButton clicked, textField add 'X' char - (void)onXButtonClicked { self.idCardNumberSystemModify.text = [_idCardNumberSystemModify.text stringByAppendingString:@"X"]; } //remove XButton from keyboard when the keyboard hide - (void)removeXButtonFromKeyBoard { int cnt = [[UIApplication sharedApplication] windows].count; UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:cnt - 1]; [[keyboardWindow viewWithTag:XBUTTON_MODIFY_TAG] removeFromSuperview]; }
// // NumberKeyboardView.h // IdNumberInput // // Created by yxhe on 16/5/9. // Copyright © 2016年 yxhe. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @class NumberKeyboardView; //the defined numberPad delegate @protocol NumberKeyBoardViewDelegate<NSObject> @optional - (void)keyboard:(NumberKeyboardView *)keyboard didClickButton:(UIButton *)textBtn withFieldString:(NSMutableString *)string; @end //numberPad view @interface NumberKeyboardView:UIView @property (nonatomic, assign) id<NumberKeyBoardViewDelegate> delegate; @property (nonatomic, strong) NSMutableString *string; @end
// // NumberKeyboardView.m // IdNumberInput // // Created by yxhe on 16/5/9. // Copyright © 2016年 yxhe. All rights reserved. // #import "NumberKeyboardView.h" #import "ViewController.h" #define KEYBOARD_HEIGHT 216 #define SCREEN_SIZE [UIScreen mainScreen].bounds.size @implementation NumberKeyboardView //custom the view init - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if(self) { self.frame = CGRectMake(0, SCREEN_SIZE.height - KEYBOARD_HEIGHT, SCREEN_SIZE.width, KEYBOARD_HEIGHT); self.string = [NSMutableString string]; self.backgroundColor = [UIColor grayColor]; //initialize the keyboard [self createButtons]; } return self; } //add button to the defined keyboard view - (UIButton *)addButtonWithTitle:(NSString *)title frame:(CGRect)frame_rect image:(UIImage *)normal_image highImage:(UIImage *)high_image { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setFrame:frame_rect]; // button.titleLabel.font = [UIFont boldSystemFontOfSize:20]; [button setTitle:title forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button setBackgroundImage:normal_image forState:UIControlStateNormal]; [button setBackgroundImage:high_image forState:UIControlStateHighlighted]; return button; } //create all the buttons - (void)createButtons { //set the key titles NSArray *titleArray = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"X", @"0", @"delete", nil]; //design the keyboard int index = 0; float button_width = (SCREEN_SIZE.width - 30)/3; float button_height = (KEYBOARD_HEIGHT - 40)/4; for(int i = 0; i < 4; i++) for(int j = 0; j < 3; j++) { float x = 5 + j*(button_width + 10); float y = 5 + i*(button_height + 10); UIButton *button = [self addButtonWithTitle:titleArray[index] frame:CGRectMake(x, y, button_width, button_height) image:nil highImage:[UIImage imageNamed:@"bgcolor.png"]]; [button addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside]; [button setBackgroundColor:[UIColor whiteColor]]; [self addSubview:button]; index++; } } //button callback - (void)onClick:(UIButton *)button { //respond to local button events if([button.currentTitle isEqualToString:@"delete"] && self.string > 0) [self.string deleteCharactersInRange:NSMakeRange(self.string.length-1, 1)]; else [self.string appendString:button.currentTitle]; //call the delegate, first make sure it can respond to selector, then do the delegate method if ([self.delegate respondsToSelector:@selector(keyboard:didClickButton:withFieldString:)]) [self.delegate keyboard:self didClickButton:button withFieldString:self.string]; } @end创建一个view类,在里面定义一个委托,这个view持有一个string,通过委托函数实现view里面的编辑和主view里面的编辑框string挂钩,使得主view能够响应这个键盘view的button事件。
//initalize the second textField _idCardNumberSelfDefine = [[UITextField alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2 - 140, 200, 280, 30)]; [_idCardNumberSelfDefine setBorderStyle:UITextBorderStyleRoundedRect]; [_idCardNumberSelfDefine setTextAlignment:UITextAlignmentLeft]; [_idCardNumberSelfDefine setPlaceholder:@"input ID with defined keyboard"]; [_idCardNumberSelfDefine setClearButtonMode:UITextFieldViewModeWhileEditing]; [self.view addSubview:_idCardNumberSelfDefine]; [_idCardNumberSelfDefine setDelegate:self]; //intialize the defined keyboardview self.numberKeyboard = [[NumberKeyboardView alloc] init]; self.numberKeyboard.delegate = self; _idCardNumberSelfDefine.inputView = self.numberKeyboard; //replace the input keyboard with selfdefined keypad
#pragma mark - define method: callbacks - (void)keyboard:(NumberKeyboardView *)keyboard didClickButton:(UIButton *)textBtn withFieldString:(NSMutableString *)string { _idCardNumberSelfDefine.text = string; NSLog(@"defined keyboard button clicked"); } #pragma mark - submit button event - (void)onSubmitBtnClicked { NSLog(@"cardnumber system modify: %@", _idCardNumberSystemModify.text); NSLog(@"cardnumber self define: %@", _idCardNumberSelfDefine.text); [self.idCardNumberSystemModify resignFirstResponder]; [self.idCardNumberSelfDefine resignFirstResponder]; }