效果图,如果使用,出现任何问题请告知,或者下方留言,我好以及改正
.h文件:
#import <UIKit/UIKit.h> @interface LicenseKeyBoardView : UIView - (instancetype)initWithFrame:(CGRect)frame withTextField:(UITextField *)textField; @end
.m文件
#import "LicenseKeyBoardView.h" #define kWidth [UIScreen mainScreen].bounds.size.width #define kHeight [UIScreen mainScreen].bounds.size.height #define HEXCOLOR(hex, alp) [UIColor colorWithRed:((float)((hex & 0xFF0000) >> 16)) / 255.0 green:((float)((hex & 0xFF00) >> 8)) / 255.0 blue:((float)(hex & 0xFF)) / 255.0 alpha:alp] #define LicenseLength 7 //最大的车牌号长度为7 @interface LicenseKeyBoardView()<UIGestureRecognizerDelegate> { UIView *_backView1; //第一个view 省份 UIView *_backView2; //第二个view 字母view UIButton *_btn;//abc和返回按键 } @property (nonatomic, strong) NSArray *provinceArr; //省市简写数组 @property (nonatomic, strong) NSArray *letterArr; //车牌号码字母数字数组 @property(nonatomic,strong)UITextField *textField; @end @implementation LicenseKeyBoardView - (NSArray *)provinceArr { if (!_provinceArr) { _provinceArr = @[@"京",@"津",@"渝",@"沪",@"冀",@"晋",@"辽",@"吉",@"黑",@"苏",@"浙",@"皖",@"闽",@"赣",@"鲁",@"豫",@"鄂",@"湘",@"粤",@"琼",@"川",@"贵",@"云",@"陕",@"甘",@"青",@"蒙",@"桂",@"宁",@"新",@"",@"藏",@"使",@"领",@"警",@"学",@"港",@"澳",@""]; } return _provinceArr; } - (NSArray *)letterArr { if (!_letterArr) { _letterArr = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"0",@"Q",@"W",@"E",@"R",@"T",@"Y",@"U",@"I",@"O",@"P",@"A",@"S",@"D",@"F",@"G",@"H",@"J",@"K",@"L",@"",@"Z",@"X",@"C",@"V",@"B",@"N",@"M",@""]; } return _letterArr; } - (instancetype)initWithFrame:(CGRect)frame withTextField:(UITextField *)textField{ frame = CGRectMake(0, 0, kWidth, kHeight*0.33); if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor redColor]; self.textField = textField; //注册一个通知,后面会用到,来监听abc字母键 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFAction:) name:@"abc" object:nil]; //添加一个手势,点击键盘外面收回键盘 UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hiddenView)]; recognizer.delegate = self; [self addGestureRecognizer:recognizer]; [self setupUI]; } return self; } - (void)setupUI { CGSize size = self.frame.size; _backView1 = [[UIView alloc] initWithFrame:self.bounds]; _backView1.backgroundColor = HEXCOLOR(0xd2d5da, 1); _backView1.hidden = NO; _backView2 = [[UIView alloc] initWithFrame:self.bounds]; _backView2.hidden = YES; _backView2.backgroundColor = HEXCOLOR(0xd2d5da, 1); [self addSubview:_backView1]; [self addSubview:_backView2]; int row = 4; int column = 10; CGFloat btnY = 4; CGFloat btnX = 2; CGFloat maginR = 5; CGFloat maginC = 10; CGFloat btnW = (size.width - maginR * (column -1) - 2 * btnX)/column; CGFloat btnH = (_backView1.frame.size.height - maginC * (row - 1) - 6) / row; CGFloat m = 12; CGFloat w = (size.width - 24 - 7 * btnW - 6 * maginR - 2 * btnX)/2; CGFloat mw = (size.width - 8 * maginR - 9 * btnW - 2 * btnX) / 2; NSLog(@"LY >> count - %zd", self.provinceArr.count); for (int i = 0; i < self.provinceArr.count; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; if (i / column == 3) { if (i == 30) { btn.frame = CGRectMake(btnX, btnY + 3 * (btnH + maginC), w, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_abc"] forState:UIControlStateNormal]; btn.enabled = NO; _btn = btn; }else if (i == 38) { btn.frame = CGRectMake(6 * (btnW + maginR) + btnW + w + m + m, btnY + 3 * (btnH + maginC), w, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_over"] forState:UIControlStateNormal]; }else { btn.frame = CGRectMake((i % column - 1)*(btnW + maginR) + w + m + btnX, btnY + 3 * (btnH + maginC), btnW, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal]; } }else { btn.frame = CGRectMake(btnW * (i % column) + i % column * maginR + btnX, btnY + i/column * (btnH + maginC), btnW, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal]; } [btn setTitleColor:HEXCOLOR(0x23262F, 1) forState:UIControlStateNormal]; [btn setTitle:self.provinceArr[i] forState:UIControlStateNormal]; btn.layer.cornerRadius = 3; btn.layer.masksToBounds = YES; btn.tag = i; [btn addTarget:self action:@selector(btn1Click:) forControlEvents:UIControlEventTouchUpInside]; [_backView1 addSubview:btn]; } for (int i = 0; i < self.letterArr.count; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; if (i >= 20 && i < 29) { btn.frame = CGRectMake(btnX + mw + (btnW + maginR) * (i % column), btnY + 2 * (btnH + maginC), btnW, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal]; }else if (i >= 29) { if (i == 29) { btn.frame = CGRectMake(btnX, btnY + 3 * (btnH + maginC), w, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_back"] forState:UIControlStateNormal]; }else if (i == 37) { btn.frame = CGRectMake(6 * (btnW + maginR) + btnW + w + m + m + btnX, btnY + 3 * (btnH + maginC), w, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_over"] forState:UIControlStateNormal]; }else { btn.frame = CGRectMake((i % column)*(btnW + maginR) + w + m + btnX, btnY + 3 * (btnH + maginC), btnW, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal]; } }else { btn.frame = CGRectMake(btnW * (i % column) + i % column * maginR + btnX, btnY + i/column * (btnH + maginC), btnW, btnH); [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal]; } [btn setTitleColor:HEXCOLOR(0x23262F, 1) forState:UIControlStateNormal]; [btn setTitle:self.letterArr[i] forState:UIControlStateNormal]; btn.layer.cornerRadius = 3; btn.layer.masksToBounds = YES; btn.tag = i; [btn addTarget:self action:@selector(btn2Click:) forControlEvents:UIControlEventTouchUpInside]; [_backView2 addSubview:btn]; } } - (void)btn1Click:(UIButton *)sender { // NSLog(@" >>> provinceArr: - %@ -- tag - %zd", self.provinceArr[sender.tag],sender.tag); _btn.enabled = YES; if (sender.tag == 30) { // NSLog(@"点击了abc键"); if (_backView2.hidden) { // NSLog(@"_backView2 隐藏了"); _backView1.hidden = YES; _backView2.hidden = NO; }else { sender.enabled = NO; } }else if (sender.tag == 38){ // 点击删除键 if (_backView2.hidden) { [self deleteBtnClick]; } }else { //点击汉字字母或者数字键 _backView1.hidden = YES; _backView2.hidden = NO; if(self.textField.text.length < LicenseLength){ [self.textField insertText:self.provinceArr[sender.tag]]; } } } - (void)btn2Click:(UIButton *)sender { if (sender.tag == 29) { // NSLog(@"点击了abc键"); _backView1.hidden = NO; _backView2.hidden = YES; }else if (sender.tag == 37) { // NSLog(@"点击了删除键"); [self deleteBtnClick]; }else { if(self.textField.text.length < LicenseLength){ [self.textField insertText:self.letterArr[sender.tag]]; } } } - (void)deleteBtnClick{ [self.textField deleteBackward]; if (self.textField.text.length == 1) { //删除完了,没有字符可以删除了,切换显示的view [self deleteEnd]; } } /** 如果textfield删除完毕,则显示省份 */ - (void)deleteEnd { _backView1.hidden = NO; _backView2.hidden = YES; } //通知的监听方法 - (void)textFAction:(NSNotification *)notification { // NSLog(@" >> info -- %@", notification.userInfo); NSString *str = notification.userInfo[@"text"]; if (str.length == 0) { _btn.enabled = NO; }else if (str.length == 7) { [self hiddenView]; }else { _backView1.hidden = YES; _backView2.hidden = NO; _btn.enabled = YES; } } //初次弹出键盘时 - (void)showWithString:(NSString *)string { // NSLog(@" >> string -- %@", string); _backView1.hidden = YES; _backView2.hidden = NO; _btn.enabled = YES; } //收回键盘 - (void)hiddenView { CGSize size = [UIScreen mainScreen].bounds.size; [UIView animateWithDuration:0.3 animations:^{ CGRect frame = self->_backView1.frame; frame.origin.y = size.height; self->_backView1.frame = frame; } completion:^(BOOL finished) { [self removeFromSuperview]; }]; [UIView animateWithDuration:0.3 animations:^{ CGRect frame = self->_backView2.frame; frame.origin.y = size.height; self->_backView2.frame = frame; } completion:^(BOOL finished) { [self removeFromSuperview]; }]; } //手势的代理方法 #pragma mark >> UIGestureRecognizerDelegate - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isDescendantOfView:_backView1] || [touch.view isDescendantOfView:_backView2] ) { return NO; } return YES; } //销毁通知 - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } @end
使用:
该封装使用了四张图片: