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

.h文件:

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface LicenseKeyBoardView : UIView
  4. - (instancetype)initWithFrame:(CGRect)frame withTextField:(UITextField *)textField;
  5. @end

.m文件

  1. #import "LicenseKeyBoardView.h"
  2. #define kWidth [UIScreen mainScreen].bounds.size.width
  3. #define kHeight [UIScreen mainScreen].bounds.size.height
  4. #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]
  5.  
  6. #define LicenseLength 7 //最大的车牌号长度为7
  7.  
  8. @interface LicenseKeyBoardView()<UIGestureRecognizerDelegate>
  9. {
  10. UIView *_backView1; //第一个view 省份
  11. UIView *_backView2; //第二个view 字母view
  12. UIButton *_btn;//abc和返回按键
  13. }
  14. @property (nonatomic, strong) NSArray *provinceArr; //省市简写数组
  15. @property (nonatomic, strong) NSArray *letterArr; //车牌号码字母数字数组
  16. @property(nonatomic,strong)UITextField *textField;
  17. @end
  18.  
  19. @implementation LicenseKeyBoardView
  20.  
  21. - (NSArray *)provinceArr {
  22. if (!_provinceArr) {
  23. _provinceArr = @[@"京",@"津",@"渝",@"沪",@"冀",@"晋",@"辽",@"吉",@"黑",@"苏",@"浙",@"皖",@"闽",@"赣",@"鲁",@"豫",@"鄂",@"湘",@"粤",@"琼",@"川",@"贵",@"云",@"陕",@"甘",@"青",@"蒙",@"桂",@"宁",@"新",@"",@"藏",@"使",@"领",@"警",@"学",@"港",@"澳",@""];
  24. }
  25. return _provinceArr;
  26. }
  27.  
  28. - (NSArray *)letterArr {
  29. if (!_letterArr) {
  30. _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",@""];
  31. }
  32. return _letterArr;
  33. }
  34.  
  35. - (instancetype)initWithFrame:(CGRect)frame withTextField:(UITextField *)textField{
  36. frame = CGRectMake(0, 0, kWidth, kHeight*0.33);
  37. if (self = [super initWithFrame:frame]) {
  38. self.backgroundColor = [UIColor redColor];
  39. self.textField = textField;
  40. //注册一个通知,后面会用到,来监听abc字母键
  41. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFAction:) name:@"abc" object:nil];
  42. //添加一个手势,点击键盘外面收回键盘
  43. UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hiddenView)];
  44. recognizer.delegate = self;
  45. [self addGestureRecognizer:recognizer];
  46. [self setupUI];
  47. }
  48. return self;
  49. }
  50.  
  51. - (void)setupUI {
  52. CGSize size = self.frame.size;
  53.  
  54. _backView1 = [[UIView alloc] initWithFrame:self.bounds];
  55. _backView1.backgroundColor = HEXCOLOR(0xd2d5da, 1);
  56. _backView1.hidden = NO;
  57.  
  58. _backView2 = [[UIView alloc] initWithFrame:self.bounds];
  59. _backView2.hidden = YES;
  60. _backView2.backgroundColor = HEXCOLOR(0xd2d5da, 1);
  61.  
  62. [self addSubview:_backView1];
  63. [self addSubview:_backView2];
  64.  
  65. int row = 4;
  66. int column = 10;
  67. CGFloat btnY = 4;
  68. CGFloat btnX = 2;
  69. CGFloat maginR = 5;
  70. CGFloat maginC = 10;
  71. CGFloat btnW = (size.width - maginR * (column -1) - 2 * btnX)/column;
  72. CGFloat btnH = (_backView1.frame.size.height - maginC * (row - 1) - 6) / row;
  73. CGFloat m = 12;
  74. CGFloat w = (size.width - 24 - 7 * btnW - 6 * maginR - 2 * btnX)/2;
  75. CGFloat mw = (size.width - 8 * maginR - 9 * btnW - 2 * btnX) / 2;
  76. NSLog(@"LY >> count - %zd", self.provinceArr.count);
  77. for (int i = 0; i < self.provinceArr.count; i++) {
  78. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  79. if (i / column == 3) {
  80. if (i == 30) {
  81. btn.frame = CGRectMake(btnX, btnY + 3 * (btnH + maginC), w, btnH);
  82. [btn setBackgroundImage:[UIImage imageNamed:@"key_abc"] forState:UIControlStateNormal];
  83. btn.enabled = NO;
  84. _btn = btn;
  85. }else if (i == 38) {
  86. btn.frame = CGRectMake(6 * (btnW + maginR) + btnW + w + m + m, btnY + 3 * (btnH + maginC), w, btnH);
  87. [btn setBackgroundImage:[UIImage imageNamed:@"key_over"] forState:UIControlStateNormal];
  88. }else {
  89. btn.frame = CGRectMake((i % column - 1)*(btnW + maginR) + w + m + btnX, btnY + 3 * (btnH + maginC), btnW, btnH);
  90. [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
  91. }
  92. }else {
  93. btn.frame = CGRectMake(btnW * (i % column) + i % column * maginR + btnX, btnY + i/column * (btnH + maginC), btnW, btnH);
  94. [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
  95. }
  96. [btn setTitleColor:HEXCOLOR(0x23262F, 1) forState:UIControlStateNormal];
  97. [btn setTitle:self.provinceArr[i] forState:UIControlStateNormal];
  98. btn.layer.cornerRadius = 3;
  99. btn.layer.masksToBounds = YES;
  100. btn.tag = i;
  101. [btn addTarget:self action:@selector(btn1Click:) forControlEvents:UIControlEventTouchUpInside];
  102. [_backView1 addSubview:btn];
  103. }
  104.  
  105. for (int i = 0; i < self.letterArr.count; i++) {
  106.  
  107. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  108.  
  109. if (i >= 20 && i < 29) {
  110.  
  111. btn.frame = CGRectMake(btnX + mw + (btnW + maginR) * (i % column), btnY + 2 * (btnH + maginC), btnW, btnH);
  112. [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
  113.  
  114. }else if (i >= 29) {
  115. if (i == 29) {
  116. btn.frame = CGRectMake(btnX, btnY + 3 * (btnH + maginC), w, btnH);
  117. [btn setBackgroundImage:[UIImage imageNamed:@"key_back"] forState:UIControlStateNormal];
  118. }else if (i == 37) {
  119. btn.frame = CGRectMake(6 * (btnW + maginR) + btnW + w + m + m + btnX, btnY + 3 * (btnH + maginC), w, btnH);
  120. [btn setBackgroundImage:[UIImage imageNamed:@"key_over"] forState:UIControlStateNormal];
  121. }else {
  122. btn.frame = CGRectMake((i % column)*(btnW + maginR) + w + m + btnX, btnY + 3 * (btnH + maginC), btnW, btnH);
  123. [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
  124. }
  125. }else {
  126. btn.frame = CGRectMake(btnW * (i % column) + i % column * maginR + btnX, btnY + i/column * (btnH + maginC), btnW, btnH);
  127. [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
  128. }
  129. [btn setTitleColor:HEXCOLOR(0x23262F, 1) forState:UIControlStateNormal];
  130. [btn setTitle:self.letterArr[i] forState:UIControlStateNormal];
  131.  
  132. btn.layer.cornerRadius = 3;
  133. btn.layer.masksToBounds = YES;
  134. btn.tag = i;
  135. [btn addTarget:self action:@selector(btn2Click:) forControlEvents:UIControlEventTouchUpInside];
  136. [_backView2 addSubview:btn];
  137. }
  138. }
  139.  
  140. - (void)btn1Click:(UIButton *)sender {
  141.  
  142. // NSLog(@" >>> provinceArr: - %@ -- tag - %zd", self.provinceArr[sender.tag],sender.tag);
  143. _btn.enabled = YES;
  144. if (sender.tag == 30) {
  145. // NSLog(@"点击了abc键");
  146. if (_backView2.hidden) {
  147. // NSLog(@"_backView2 隐藏了");
  148. _backView1.hidden = YES;
  149. _backView2.hidden = NO;
  150. }else {
  151. sender.enabled = NO;
  152. }
  153.  
  154. }else if (sender.tag == 38){
  155. // 点击删除键
  156. if (_backView2.hidden) {
  157. [self deleteBtnClick];
  158. }
  159. }else {
  160. //点击汉字字母或者数字键
  161. _backView1.hidden = YES;
  162. _backView2.hidden = NO;
  163. if(self.textField.text.length < LicenseLength){
  164. [self.textField insertText:self.provinceArr[sender.tag]];
  165. }
  166. }
  167. }
  168.  
  169. - (void)btn2Click:(UIButton *)sender {
  170.  
  171. if (sender.tag == 29) {
  172. // NSLog(@"点击了abc键");
  173. _backView1.hidden = NO;
  174. _backView2.hidden = YES;
  175.  
  176. }else if (sender.tag == 37) {
  177. // NSLog(@"点击了删除键");
  178.  
  179. [self deleteBtnClick];
  180.  
  181. }else {
  182. if(self.textField.text.length < LicenseLength){
  183. [self.textField insertText:self.letterArr[sender.tag]];
  184. }
  185.  
  186. }
  187. }
  188. - (void)deleteBtnClick{
  189. [self.textField deleteBackward];
  190.  
  191. if (self.textField.text.length == 1) {
  192. //删除完了,没有字符可以删除了,切换显示的view
  193. [self deleteEnd];
  194. }
  195. }
  196. /**
  197. 如果textfield删除完毕,则显示省份
  198. */
  199. - (void)deleteEnd {
  200. _backView1.hidden = NO;
  201. _backView2.hidden = YES;
  202. }
  203.  
  204. //通知的监听方法
  205. - (void)textFAction:(NSNotification *)notification {
  206.  
  207. // NSLog(@" >> info -- %@", notification.userInfo);
  208. NSString *str = notification.userInfo[@"text"];
  209. if (str.length == 0) {
  210. _btn.enabled = NO;
  211. }else if (str.length == 7) {
  212. [self hiddenView];
  213. }else {
  214. _backView1.hidden = YES;
  215. _backView2.hidden = NO;
  216. _btn.enabled = YES;
  217. }
  218. }
  219.  
  220. //初次弹出键盘时
  221. - (void)showWithString:(NSString *)string {
  222. // NSLog(@" >> string -- %@", string);
  223.  
  224. _backView1.hidden = YES;
  225. _backView2.hidden = NO;
  226. _btn.enabled = YES;
  227. }
  228.  
  229. //收回键盘
  230. - (void)hiddenView {
  231.  
  232. CGSize size = [UIScreen mainScreen].bounds.size;
  233. [UIView animateWithDuration:0.3 animations:^{
  234. CGRect frame = self->_backView1.frame;
  235. frame.origin.y = size.height;
  236. self->_backView1.frame = frame;
  237. } completion:^(BOOL finished) {
  238. [self removeFromSuperview];
  239. }];
  240.  
  241. [UIView animateWithDuration:0.3 animations:^{
  242. CGRect frame = self->_backView2.frame;
  243. frame.origin.y = size.height;
  244. self->_backView2.frame = frame;
  245. } completion:^(BOOL finished) {
  246. [self removeFromSuperview];
  247. }];
  248. }
  249.  
  250. //手势的代理方法
  251. #pragma mark >> UIGestureRecognizerDelegate
  252. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
  253. if ([touch.view isDescendantOfView:_backView1] ||
  254. [touch.view isDescendantOfView:_backView2] ) {
  255.  
  256. return NO;
  257. }
  258. return YES;
  259. }
  260.  
  261. //销毁通知
  262. - (void)dealloc {
  263.  
  264. [[NSNotificationCenter defaultCenter] removeObserver:self];
  265. }
  266.  
  267. @end
  1.  

使用:

该封装使用了四张图片:

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. 使用Profile和Resources Filter隔离测试环境

    转自:http://juvenshun.iteye.com/blog/206825 Maven能够帮我们很好的管理测试,我们可以在 src/test/java 和 src/test/resources ...

  2. 基金 、 社保和QFII等机构的重仓股排名评测

    来源:基金前20大重仓股持仓股排名 基金前15大重仓股持仓股排名 基金重仓前15大个股,相较于同期沪深300的平均收益, 近1月:2.23%, 近3月:3.09%, 近6月:9.61%, 近1年:13 ...

  3. Win 10来袭,人工智能女将打头阵

    7月1日,微软小冰身"考官",其姐姐微软小娜(Cortana)解锁"科技动态"功能,为即将来临的Win 10打头阵. 中国IT产业界从来没有见过这样的阵势,难于 ...

  4. U3D常用题

    最先执行的方法是:1.(激活时的初始化代码)Awake,2.Start.3.Update[FixUpdate.LateUpdate].4.(渲染模块)OnGUI.5.再向后,就是卸载模块(TearDo ...

  5. SQLServer2008 导出数据库表结构和数据

    很多朋友问到sql server数据库”生成脚本”,只导出了数据库的sql脚本,而表里的数据依然没有导出来.很简单,看教程: 注:我这里用的SQLServer2008,其它版本应该差不多. 一.选中要 ...

  6. npm更新升级

    更新 npm install npm -g

  7. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验五:按键模块④ — 点击,长点击,双击

    实验五:按键模块④ - 点击,长点击,双击 实验二至实验四,我们一共完成如下有效按键: l 点击(按下有效) l 点击(释放有效) l 长击(长按下有效) l 双击(连续按下有效) 然而,不管哪个实验 ...

  8. Xcode连接TFS Git用户名和密码不正确解决方案

    团队要将原来搭建的Git服务全部迁移到TFS的Git上统一管理,迁移的过程非常顺利.当要用Xcode或者SourceTree连接TFS Git(我们的TFS身份认证是基于Windows的,使用HTTP ...

  9. Cannot change version of project facet Dynamic Web Module to 3.0 异常问题处理

    如何解决Tomcat服务器在初始化应用的时候的以下异常问题 1,Cannot change version of project facet Dynamic Web Module to 3.0 2,O ...

  10. yii2优化 - 开启 Schema 缓存

    开启 Schema 缓存 Schema 缓存是一个特殊的缓存功能,每当你使用活动记录时应该要开启这个缓存功能.如你所知, 活动记录能智能检测数据库对象的集合(例如列名.列类型.约束)而不需要手动地描述 ...