效果图,如果使用,出现任何问题请告知,或者下方留言,我好以及改正

.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
 

使用:

该封装使用了四张图片:

OC仿支付宝输入UITextField输入车牌号的更多相关文章

  1. iOS开发-通过正则表达式进行各种判断银行卡,车牌号,邮箱地址,QQ,身份证,全字母,仅输入字母或数字同时包含大小写字母和数字,仅能输入中文等

    /* *  验证银行卡号是否正确 *  车牌号验证 *  检验邮箱地址是否正确 *  手机号中间四位密文显示 *  判断QQ号是否正确(5-11位) *  判断身份证号是否正确(如末位为字母请用“x” ...

  2. UITextField设置密文延时处理---仿QQ登录密码输入

    系统的UITextField输入的时候最后一个字符会有1-2s的效果展示, 效果如下: 为了解决这个问题, 可以用字符 "●" 替换, 替换后效果如下: 用到的是UITextFie ...

  3. 限制 UITextField 输入长度

    限制 UITextField 输入长度 标签(空格分隔): UITextField UITextField 是 iOS 中最经常使用的组件之中的一个.关于它也有各种各样的需求,这些需求是它本身没有提供 ...

  4. 限制UITextField输入长度

    如果要限制UITextField输入长度最长不超过kMaxLength,那么需要实现做以下操作: 1.实现UITextFieldDelegate协议: 2.实现textField:shouldChan ...

  5. [ios仿系列]仿支付宝手势解码

    呀~.这么快就转到ios阵营了???.android还有那么多坑呢???为此我也仅仅能啃着馒头留下屈辱的眼泪了. . 本次因为开发公司产品的android版,继而ios版也负责一部分.当中一部分就是手 ...

  6. vue实战 - 车牌号校验和银行校验

    在看这篇文章之前,我建议大伙可以去把项目demo拉到本地看看.如果觉得写得不好,可以一起提提issues,一起维护.或者大伙有刚需,可以留言,后期会不断完善. 使用方法: git clone http ...

  7. iOS 仿支付宝密码支付

    代码地址如下:http://www.demodashi.com/demo/11484.html 一.准备工作 xcode 主要实现输入密码的时候不可见 二.程序实现 实现思路怎样 在支付宝输入密码的时 ...

  8. iOS手机号,身份证,车牌号正则表达式

    1.手机号判断,根据维基百科2016年6月修订的段号判断 是否是手机号 /** 手机号码 13[0-9],14[5|7|9],15[0-3],15[5-9],17[0|1|3|5|6|8],18[0- ...

  9. iOS-高仿支付宝手势解锁(九宫格)

    概述 高仿支付宝手势解锁, 通过手势枚举去实现手势密码相对应操作. 详细 代码下载:http://www.demodashi.com/demo/10706.html 基上篇[TouchID 指纹解锁] ...

随机推荐

  1. android SQLite数据库的基本操作

    SQLite是Android使用的轻量级的数据库,开发Android应用是对数据库的操作自然是必不可少. Android提供了一个SQLiteOpenHelper类来可以很方便的操作数据库, 继承和扩 ...

  2. 前端分页插件pagination

    摘要: 最近在开发项目中又用到了前端分页,以前也做过,为了方便以后使用所以将他封装成第三方插件,不依赖任何库.网上已经有很多插件,问什么还要自己造轮子? 自己写的扩展性高 不依赖任何库 作为一次技术沉 ...

  3. [Bayes] Improve HMM step by step

    以下是HMM,当emission probability变为高斯时,只需改变其中相关部分即可,也就是下图最后一行. 如下可见,在优化过程中套路没有太大的影响,但变为高斯后表达变得更精确了呢. 当然,这 ...

  4. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjec ...

  5. nginx-启动|关闭|重新加载配置文件的命令

    1.1 进入操作目录 D: cd D:\NginxTest\nginx-1.10.2 1.2 启动指令 nginx -c conf\nginx.conf 1.3 关闭指令 nginx -s stop ...

  6. 十一、K3 WISE 开发插件《VB插件开发如何代码调试 - 步骤讲解》

    =================================== 目录: 1.配置代码调试启动程序kdmain.exe 2.设置断点 3.触发调试 4.变量跟踪 ================ ...

  7. 7.13python多进程

    所以引入了     多进程*(异步) 处理效率高 #!/usr/bin/env python #!--*--coding:utf-8 --*-- #!@Time :2018/7/13 19:26 #! ...

  8. F - Toy Storage

    来源poj 2398 Mom and dad have a problem: their child, Reza, never puts his toys away when he is finish ...

  9. Python数据结构——二叉树

    数的特征和定义: 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都 ...

  10. {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二

    python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...