【iOS自定义键盘】详解

实现效果展示:

一、实现的协议方法代码

  1. #import <UIKit/UIKit.h>
  2.  
  3. //创建自定义键盘协议
  4. @protocol XFG_KeyBoardDelegate <NSObject>
  5. //创建协议方法
  6. @required//必须执行的方法
  7. - (void)numberKeyBoard:(NSInteger) number;
  8. - (void)cancelKeyBoard;
  9. - (void)finishKeyBoard;
  10. - (void)periodKeyBoard;
  11. - (void)changeKeyBoard;
  12. @optional//不必须执行方法
  13.  
  14. @end
  15.  
  16. @interface XFG_KeyBoard : UIView
  17. {
  18. @private//私有的协议方法
  19. id<XFG_KeyBoardDelegate> _delegate;
  20. }
  21.  
  22. @property (nonatomic, strong) id<XFG_KeyBoardDelegate> delegate;
  23.  
  24. - (id)initWithNumber:(NSNumber *)number;
  25. @end

二、自定义键盘创建

  1. #import "XFG_KeyBoard.h"
  2. #define kScreenWidth [UIScreen mainScreen].bounds.size.width
  3. #define kScreenHeight [UIScreen mainScreen].bounds.size.height
  4.  
  5. @implementation XFG_KeyBoard
  6.  
  7. - (id)initWithNumber:(NSNumber *)number
  8. {
  9. self = [super init];
  10. if (self) {
  11.  
  12. self.backgroundColor = [UIColor greenColor];
  13. self.frame = CGRectMake(, kScreenHeight - , kScreenHeight, );
  14. if ([number isEqualToNumber:@]) {
  15.  
  16. [self initKeyBoardNumber_1];
  17. } else if ([number isEqualToNumber:@]){
  18.  
  19. [self initKeyBoardNumber_2];
  20. } else if ([number isEqualToNumber:@]){
  21.  
  22. [self initKeyBoardNumber_3];
  23. }
  24. }
  25.  
  26. return self;
  27. }
  28.  
  29. #pragma 键盘1自定义视图
  30. - (void)initKeyBoardNumber_1
  31. {
  32. self.frame=CGRectMake(, kScreenHeight-, kScreenWidth, );
  33. int space=;
  34. for (int i=; i<; i++) {
  35. NSString *str=[NSString stringWithFormat:@"%d",i+];
  36. UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
  37. if (i<) {
  38. button.frame=CGRectMake(i%*(kScreenWidth/)+space, i/*, kScreenWidth/-, );
  39. }
  40. else{
  41. button.frame=CGRectMake(i%*(kScreenWidth/)+space, i/*+i/*space, kScreenWidth/-, );
  42. }
  43. button.backgroundColor=[UIColor whiteColor];
  44. [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  45. button.titleLabel.font=[UIFont systemFontOfSize:];
  46. [button setTitle:str forState:UIControlStateNormal];
  47. button.tag=i+;
  48. [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  49. [self addSubview:button];
  50. }
  51. UIButton *dian=[UIButton buttonWithType:UIButtonTypeSystem];
  52. dian.frame=CGRectMake(space,*+ , kScreenWidth/-, );
  53. dian.backgroundColor=[UIColor whiteColor];
  54. [dian setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  55. dian.titleLabel.font=[UIFont systemFontOfSize:];
  56. [dian addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  57. [dian setTitle:@"." forState:UIControlStateNormal];
  58. dian.tag=;
  59. [self addSubview:dian];
  60. UIButton *ling=[UIButton buttonWithType:UIButtonTypeSystem];
  61. ling.frame=CGRectMake(kScreenWidth/+*space,*+, kScreenWidth/-, );
  62. ling.backgroundColor=[UIColor whiteColor];
  63. [ling setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  64. ling.titleLabel.font=[UIFont systemFontOfSize:];
  65. [ling setTitle:@"" forState:UIControlStateNormal];
  66. ling.tag=;
  67. [ling addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  68. [self addSubview:ling];
  69.  
  70. UIButton *computer=[UIButton buttonWithType:UIButtonTypeSystem];
  71. computer.frame=CGRectMake(kScreenWidth/*+space,*+, kScreenWidth/-, );
  72. computer.backgroundColor=[UIColor whiteColor];
  73. [computer setTitle:@"系统键盘" forState:UIControlStateNormal];
  74. computer.tag=;
  75. [computer addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  76. [self addSubview:computer];
  77.  
  78. UIButton *delete=[UIButton buttonWithType:UIButtonTypeSystem];
  79. delete.frame=CGRectMake(kScreenWidth/*+space,, kScreenWidth/-, );
  80. [delete addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  81. delete.tag=;
  82.  
  83. UIImageView *deleteImage=[[UIImageView alloc]initWithFrame:CGRectMake((kScreenWidth/- - ) * 1.0 / , , , )];
  84. deleteImage.image=[UIImage imageNamed:@"goumai_03"];
  85. [delete addSubview:deleteImage];
  86.  
  87. // [delete setBackgroundImage:[UIImage imageNamed:@"goumai_03"] forState:UIControlStateNormal];
  88. [self addSubview:delete];
  89.  
  90. UIButton *confirm=[UIButton buttonWithType:UIButtonTypeSystem];
  91. confirm.frame=CGRectMake(kScreenWidth/*+space,*, kScreenWidth/-, );
  92. confirm.backgroundColor=[UIColor blueColor];
  93. [confirm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  94. confirm.titleLabel.font=[UIFont systemFontOfSize:];
  95. [confirm setTitle:@"确 定" forState:UIControlStateNormal];
  96. [confirm addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  97. confirm.tag=;
  98. [self addSubview:confirm];
  99. }
  100.  
  101. #pragma 键盘2自定义视图
  102. - (void)initKeyBoardNumber_2
  103. {
  104. UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(, , kScreenWidth - , )];
  105.  
  106. button.backgroundColor = [UIColor grayColor];
  107. button.titleLabel.font = [UIFont systemFontOfSize:];
  108. [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  109. [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  110. [self addSubview:button];
  111. button.tag = ;
  112. [button setTitle:@"" forState:UIControlStateNormal];
  113.  
  114. UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, , , )];
  115.  
  116. cancel.backgroundColor = [UIColor yellowColor];
  117. cancel.titleLabel.font = [UIFont systemFontOfSize:];
  118. [cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  119. [cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  120. [self addSubview:cancel];
  121. cancel.tag = ;
  122. [cancel setTitle:@"删 除" forState:UIControlStateNormal];
  123. }
  124.  
  125. #pragma 键盘3自定义视图
  126. - (void)initKeyBoardNumber_3
  127. {
  128. UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(, , kScreenWidth - , )];
  129.  
  130. button.backgroundColor = [UIColor purpleColor];
  131. button.titleLabel.font = [UIFont systemFontOfSize:];
  132. [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  133. [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  134. [self addSubview:button];
  135. button.tag = ;
  136. [button setTitle:@"" forState:UIControlStateNormal];
  137.  
  138. UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, , , )];
  139.  
  140. cancel.backgroundColor = [UIColor yellowColor];
  141. cancel.titleLabel.font = [UIFont systemFontOfSize:];
  142. [cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  143. [cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
  144. [self addSubview:cancel];
  145. cancel.tag = ;
  146. [cancel setTitle:@"删 除" forState:UIControlStateNormal];
  147. }
  148.  
  149. #pragma 键盘点击按钮事件
  150. - (void)keyBoardAciont:(UIButton *)sender
  151. {
  152.  
  153. UIButton* btn = (UIButton*)sender;
  154.  
  155. NSInteger number = btn.tag;
  156.  
  157. // no delegate, print log info
  158. if (nil == _delegate) {
  159. NSLog(@"button tag [%ld]",(long)number);
  160. return;
  161. }
  162.  
  163. if (number <= && number >= ) {
  164. [_delegate numberKeyBoard:number];
  165. return;
  166. }
  167.  
  168. if ( == number) {
  169. [_delegate cancelKeyBoard];
  170. return;
  171. }
  172. if ( == number) {
  173. [_delegate periodKeyBoard];
  174. return;
  175. }
  176. if ( == number) {
  177. [_delegate changeKeyBoard];
  178. return;
  179. }
  180.  
  181. if ( == number) {
  182. [_delegate finishKeyBoard];
  183. return;
  184. }
  185.  
  186. }
  187.  
  188. @end

三、自定义键盘运用

  1. #import "ViewController.h"
  2. #import "XFG_KeyBoard.h"
  3. #define kScreenWidth [UIScreen mainScreen].bounds.size.width
  4. #define kScreenHeight [UIScreen mainScreen].bounds.size.height
  5.  
  6. @interface ViewController ()<UITextFieldDelegate, XFG_KeyBoardDelegate>
  7.  
  8. @property (nonatomic, strong) XFG_KeyBoard *xfg_keyboard;
  9. @property (nonatomic, strong) UITextField *textField;
  10. @end
  11.  
  12. @implementation ViewController
  13.  
  14. - (void)viewDidLoad {
  15. [super viewDidLoad];
  16. // Do any additional setup after loading the view, typically from a nib.
  17. self.title = @"小飞哥键盘";
  18. self.textField = [[UITextField alloc] initWithFrame:CGRectMake(, , kScreenWidth - , )];
  19. self.textField.delegate = self;
  20. self.textField.backgroundColor = [UIColor greenColor];
  21. self.textField.placeholder = @"(默认系统键盘)";
  22.  
  23. [self.view addSubview:self.textField];
  24.  
  25. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hidenKeyBoard)];
  26. [self.view addGestureRecognizer:tap];
  27.  
  28. UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:@[@"键盘1",@"键盘2",@"键盘3",@"系统键盘"]];
  29. segment.frame = CGRectMake(, , kScreenWidth, );
  30. [segment addTarget:self action:@selector(keyBoardTypeAction:) forControlEvents:UIControlEventValueChanged];
  31. [self.view addSubview:segment];
  32.  
  33. }
  34.  
  35. - (void)keyBoardTypeAction:(id )sender
  36. {
  37. UISegmentedControl *seg = (UISegmentedControl *)sender;
  38. NSLog(@"intage = %ld", (long)seg.selectedSegmentIndex);
  39.  
  40. if (seg.selectedSegmentIndex == ) {
  41. self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@];
  42. self.textField.inputView = self.xfg_keyboard;
  43. self.xfg_keyboard.delegate = self;
  44. [self.textField reloadInputViews];
  45. }
  46. if (seg.selectedSegmentIndex == ) {
  47. self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@];
  48. self.textField.inputView = self.xfg_keyboard;
  49. self.xfg_keyboard.delegate = self;
  50. [self.textField reloadInputViews];
  51.  
  52. }
  53.  
  54. if (seg.selectedSegmentIndex == ) {
  55. self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@];
  56. self.textField.inputView = self.xfg_keyboard;
  57. self.xfg_keyboard.delegate = self;
  58. [self.textField reloadInputViews];
  59. }
  60.  
  61. if (seg.selectedSegmentIndex == ) {
  62. self.textField.inputView = nil;
  63. [self.textField reloadInputViews];
  64. }
  65.  
  66. }
  67.  
  68. - (void)hidenKeyBoard
  69. {
  70. NSLog(@"键盘隐藏");
  71. [self.textField resignFirstResponder];
  72. }
  73.  
  74. - (void)textFieldDidBeginEditing:(UITextField *)textField
  75. {
  76. NSLog(@"显示键盘");
  77. }
  78.  
  79. - (void)numberKeyBoard:(NSInteger)number
  80. {
  81. NSString *str = self.textField.text;
  82. self.textField.text = [NSString stringWithFormat:@"%@%ld",str,(long)number];
  83. }
  84.  
  85. - (void)cancelKeyBoard
  86. {
  87.  
  88. NSMutableString *muStr = [[NSMutableString alloc] initWithString:self.textField.text];
  89. if (muStr.length <= ) {
  90. return;
  91. }
  92. [muStr deleteCharactersInRange:NSMakeRange([muStr length] - , )];
  93. self.textField.text = muStr;
  94. }
  95.  
  96. #pragma 输入点
  97. -(void)periodKeyBoard{
  98.  
  99. if ([self.textField.text isEqualToString:@""]) {
  100. return;
  101. }
  102.  
  103. //判断当前时候存在一个点
  104. if ([self.textField.text rangeOfString:@"."].location == NSNotFound) {
  105. //输入中没有点
  106. NSMutableString *mutableString=[[NSMutableString alloc]initWithFormat:@"%@%@",self.textField.text,@"."];
  107. self.textField.text=mutableString;
  108. }
  109. }
  110.  
  111. -(void)changeKeyBoard{
  112.  
  113. self.textField.inputView = nil;
  114. [self.textField reloadInputViews];
  115. }
  116.  
  117. -(void)finishKeyBoard{
  118. [self.view endEditing:YES];
  119. }
  120.  
  121. - (void)didReceiveMemoryWarning {
  122. [super didReceiveMemoryWarning];
  123. // Dispose of any resources that can be recreated.
  124. }
  125.  
  126. @end

【iOS自定义键盘及键盘切换】详解的更多相关文章

  1. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  2. iOS开发--常用技巧 (MJRefresh详解)

         iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...

  3. iOS学习——(转)UIResponder详解

    本文转载自:ios开发 之 UIResponder详解 我们知道UIResponder是所有视图View的基类,在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,包括触摸事件( ...

  4. iOS学习——iOS项目Project 和 Targets配置详解

    最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理.我们iOS项目的开发 ...

  5. iOS开发之UITextField的使用详解

    UITextField的使用详解 UITextField控件是开发中,使用频率比较高的控件了,那么有必要总结一下. 一.UITextField手动编写控件 UITextField  *txtAccou ...

  6. iOS开发——多线程OC篇&多线程详解

    多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...

  7. cocos2dx-3.x 导出自定义类到 lua 过程详解

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...

  8. iOS开发——UI篇OC&transform详解

    transframe属性详解 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基 ...

  9. iOS开发——屏幕适配篇&Masonry详解

    Masonry详解 前言 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-ip ...

  10. ios开发——实战OC篇&FMDB详解

    FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

随机推荐

  1. 分享10款非常有用的 Ajax 插件

    这篇文章与大家分享的是10款非常有用的 Ajax 插件,有用于图片的,用于分页的,还有用于导航的.这些作者的想法特别新颖,希望你能从中找到自己需要的插件. 1. AJAX-ZOOM 非常强大的一款插件 ...

  2. Form Builder的三种查询方法构建

    1.使用DEFAULT_WHERE: DECLARE   V_DEFAULT_WHERE VARCHAR2(32767);  V_WHERE         VARCHAR2(32767); BEGI ...

  3. 4541: [Hnoi2016]矿区

    学习了一下平面图剖分的姿势,orz cbh 每次只要随便选择一条边,然后不停尽量向左转就行 #include <bits/stdc++.h> #define N 1300000 #defi ...

  4. css_随笔

    1 css 基础语法: 2 派生选择器 li strong { font-style: italic; font-weight: normal; } <p><strong>我是 ...

  5. zepto返回顶部动画

    点击返回顶部 function goTop(acceleration, time) { acceleration = acceleration || 0.1; time = time || 16; v ...

  6. CornerStone的使用

    俗话说:"工欲善其事必先利其器": 对于我们程序员来说,不管你是大神,还是小鱼小虾,进入公司之后,都用过源码管理工具,不然你就不是一个合格的程序员,现在各个公司用于源码管理工具通常 ...

  7. QML杂记

    1.QML编写可视化元素,运行后程序窗口上无显示.检查电脑的显卡是否支持OpenGL,如果支持请更新显卡驱动. 2.加载图片显示QML Image: Cannot open.解决在qml.qrc右击添 ...

  8. 懒加载插件- jquery.lazyload.js

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  9. [转载] Java CheckBoxTree

    代码基本上是copy的.只是在使用上有一些自己的想法. 先上code吧! 虽然别的地方也有.但是还是转一份给自己. 出处:http://blog.csdn.net/joy_125/article/de ...

  10. CentOS7 编译安装 nginx-1.10.0

    对于NGINX 支持epoll模型 epoll模型的优点 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的 ...