重点:
通过替换UITextField的inputView展示自定义键盘
获取当前系统响应链第一响应者:
UIResponder并没有提供直接获取的方法、这里调用sendAction:to:from:forEvent:方法。
当target为空时、系统会遍历响应链由第一响应者响应事件,这样我们就获取到第一响应者。
我们通过获取到的responder实现键盘数字的输入及退格操作
复制粘贴时键盘的切换键钮状态:
通过UIControlEventEditingChanged获取键盘点击后输入框内容的改变
在textField:shouldChangeCharactersInRange:replacementString:获取复制粘贴内容及进行规则判断
//ViewController.m
#import "ViewController.h"
#import "PlateInputView.h"
#define WIDTH [UIScreen mainScreen].bounds.size.width
#define HEIGHT [UIScreen mainScreen].bounds.size.height
@interface ViewController ()<UITextFieldDelegate>
@property (nonatomic,strong)PlateInputView * plateInput;
@property (nonatomic,strong)UITextField * plateTextField;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_plateTextField = [[UITextField alloc]initWithFrame:CGRectMake(30, 100, WIDTH-60, 50)];
_plateTextField.delegate = self;
_plateTextField.layer.borderColor = [UIColor blackColor].CGColor;
_plateTextField.layer.borderWidth = 1;
_plateTextField.keyboardType = UIKeyboardTypeNumberPad;//设置数字键盘防止复制粘贴板自动加空格
__block ViewController * weakSelf = self;
_plateInput = [[PlateInputView alloc]init];
_plateInput.sendTextBlock = ^(NSString *palteString) {
weakSelf.plateTextField.text = palteString;
};
_plateTextField.inputView = _plateInput;
[_plateTextField addTarget:self action:@selector(textChange:) forControlEvents:UIControlEventEditingChanged];
[self.view addSubview:_plateTextField];
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapClick:)];
[self.view addGestureRecognizer:tap];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark 车牌号输入框监听及代理方法
-(void)textChange:(UITextField *)textField{
NSString * str = textField.text;
_plateInput.plateStr = str;
}
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString * str = textField.text;
string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
str = [str stringByReplacingCharactersInRange:range withString:string];
if (str.length>0) {
NSArray * provinceArr = @[@"京",@"津",@"晋",@"冀",@"蒙",@"辽",@"黑",@"吉",@"沪",@"苏",@"浙",@"皖",@"闽",@"赣",
@"鲁",@"豫",@"鄂",@"湘",@"粤",@"桂",@"琼",@"渝",@"川",@"贵",@"云",@"藏",@"陕",@"甘",
@"青",@"宁",@"新",@"W"];
if (str.length>8) {
return NO;
}