当前位置: 首页 > news >正文

【iOS自定义键盘及键盘切换】详解

【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 
17 @interface XFG_KeyBoard : UIView
18 {
19     @private//私有的协议方法
20     id<XFG_KeyBoardDelegate> _delegate;
21 }
22 
23 @property (nonatomic, strong) id<XFG_KeyBoardDelegate> delegate;
24 
25 - (id)initWithNumber:(NSNumber *)number;
26 @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 
  8 - (id)initWithNumber:(NSNumber *)number
  9 {
 10     self = [super init];
 11     if (self) {
 12         
 13         self.backgroundColor = [UIColor greenColor];
 14         self.frame = CGRectMake(0, kScreenHeight - 150, kScreenHeight, 150);
 15         if ([number isEqualToNumber:@1]) {
 16             
 17             [self initKeyBoardNumber_1];
 18         } else if ([number isEqualToNumber:@2]){
 19             
 20             [self initKeyBoardNumber_2];
 21         } else if ([number isEqualToNumber:@3]){
 22             
 23             [self initKeyBoardNumber_3];
 24         }
 25     }
 26     
 27     return self;
 28 }
 29 
 30 #pragma 键盘1自定义视图
 31 - (void)initKeyBoardNumber_1
 32 {
 33     self.frame=CGRectMake(0, kScreenHeight-243, kScreenWidth, 243);
 34     int space=1;
 35     for (int i=0; i<9; i++) {
 36         NSString *str=[NSString stringWithFormat:@"%d",i+1];
 37         UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
 38         if (i<3) {
 39             button.frame=CGRectMake(i%3*(kScreenWidth/4)+space, i/3*61, kScreenWidth/4-1, 60);
 40         }
 41         else{
 42             button.frame=CGRectMake(i%3*(kScreenWidth/4)+space, i/3*60+i/3*space, kScreenWidth/4-1, 60);
 43         }
 44         button.backgroundColor=[UIColor whiteColor];
 45         [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
 46         button.titleLabel.font=[UIFont systemFontOfSize:24];
 47         [button setTitle:str forState:UIControlStateNormal];
 48         button.tag=i+1;
 49         [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
 50         [self addSubview:button];
 51     }
 52     UIButton *dian=[UIButton buttonWithType:UIButtonTypeSystem];
 53     dian.frame=CGRectMake(space,60*3+3 , kScreenWidth/4-1, 60);
 54     dian.backgroundColor=[UIColor whiteColor];
 55     [dian setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
 56     dian.titleLabel.font=[UIFont systemFontOfSize:24];
 57     [dian addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
 58     [dian setTitle:@"." forState:UIControlStateNormal];
 59     dian.tag=11;
 60     [self addSubview:dian];
 61     UIButton *ling=[UIButton buttonWithType:UIButtonTypeSystem];
 62     ling.frame=CGRectMake(kScreenWidth/4+1*space,60*3+3, kScreenWidth/4-1, 60);
 63     ling.backgroundColor=[UIColor whiteColor];
 64     [ling setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
 65     ling.titleLabel.font=[UIFont systemFontOfSize:24];
 66     [ling setTitle:@"0" forState:UIControlStateNormal];
 67     ling.tag=0;
 68     [ling addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
 69     [self addSubview:ling];
 70     
 71     UIButton *computer=[UIButton buttonWithType:UIButtonTypeSystem];
 72     computer.frame=CGRectMake(kScreenWidth/4*2+space,60*3+3, kScreenWidth/4-1, 60);
 73     computer.backgroundColor=[UIColor whiteColor];
 74     [computer setTitle:@"系统键盘" forState:UIControlStateNormal];
 75     computer.tag=12;
 76     [computer addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
 77     [self addSubview:computer];
 78     
 79     UIButton *delete=[UIButton buttonWithType:UIButtonTypeSystem];
 80     delete.frame=CGRectMake(kScreenWidth/4*3+space,1, kScreenWidth/4-1, 122);
 81     [delete addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
 82     delete.tag=10;
 83     
 84     UIImageView *deleteImage=[[UIImageView alloc]initWithFrame:CGRectMake((kScreenWidth/4-1 - 28) * 1.0 / 2, 50, 28, 20)];
 85     deleteImage.image=[UIImage imageNamed:@"goumai_03"];
 86     [delete addSubview:deleteImage];
 87     
 88     // [delete setBackgroundImage:[UIImage imageNamed:@"goumai_03"] forState:UIControlStateNormal];
 89     [self addSubview:delete];
 90     
 91     UIButton *confirm=[UIButton buttonWithType:UIButtonTypeSystem];
 92     confirm.frame=CGRectMake(kScreenWidth/4*3+space,61*2, kScreenWidth/4-1, 122);
 93     confirm.backgroundColor=[UIColor blueColor];
 94     [confirm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
 95     confirm.titleLabel.font=[UIFont systemFontOfSize:20];
 96     [confirm setTitle:@"确 定" forState:UIControlStateNormal];
 97     [confirm addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
 98     confirm.tag=13;
 99     [self addSubview:confirm];
100 }
101 
102 #pragma 键盘2自定义视图
103 - (void)initKeyBoardNumber_2
104 {
105     UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 150, 150)];
106     
107     button.backgroundColor = [UIColor grayColor];
108     button.titleLabel.font = [UIFont systemFontOfSize:100];
109     [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
110     [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
111     [self addSubview:button];
112     button.tag = 2;
113     [button setTitle:@"2" forState:UIControlStateNormal];
114     
115     UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, 0, 150, 150)];
116     
117     cancel.backgroundColor = [UIColor yellowColor];
118     cancel.titleLabel.font = [UIFont systemFontOfSize:33];
119     [cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
120     [cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
121     [self addSubview:cancel];
122     cancel.tag = 10;
123     [cancel setTitle:@"删 除" forState:UIControlStateNormal];
124 }
125 
126 #pragma 键盘3自定义视图
127 - (void)initKeyBoardNumber_3
128 {
129     UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 150, 150)];
130     
131     button.backgroundColor = [UIColor purpleColor];
132     button.titleLabel.font = [UIFont systemFontOfSize:100];
133     [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
134     [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
135     [self addSubview:button];
136     button.tag = 3;
137     [button setTitle:@"3" forState:UIControlStateNormal];
138     
139     UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, 0, 150, 150)];
140     
141     cancel.backgroundColor = [UIColor yellowColor];
142     cancel.titleLabel.font = [UIFont systemFontOfSize:33];
143     [cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
144     [cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
145     [self addSubview:cancel];
146     cancel.tag = 10;
147     [cancel setTitle:@"删 除" forState:UIControlStateNormal];
148 }
149 
150 #pragma 键盘点击按钮事件
151 - (void)keyBoardAciont:(UIButton *)sender
152 {
153 
154     UIButton* btn = (UIButton*)sender;
155     
156     NSInteger number = btn.tag;
157     
158     // no delegate, print log info
159     if (nil == _delegate) {
160         NSLog(@"button tag [%ld]",(long)number);
161         return;
162     }
163     
164     if (number <= 9 && number >= 0) {
165         [_delegate numberKeyBoard:number];
166         return;
167     }
168     
169     if (10 == number) {
170         [_delegate cancelKeyBoard];
171         return;
172     }
173     if (11 == number) {
174         [_delegate periodKeyBoard];
175         return;
176     }
177     if (12 == number) {
178         [_delegate changeKeyBoard];
179         return;
180     }
181     
182     if (13 == number) {
183         [_delegate finishKeyBoard];
184         return;
185     }
186     
187 }
188 
189 @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 
  7 @interface ViewController ()<UITextFieldDelegate, XFG_KeyBoardDelegate>
  8 
  9 @property (nonatomic, strong) XFG_KeyBoard *xfg_keyboard;
 10 @property (nonatomic, strong) UITextField *textField;
 11 @end
 12 
 13 @implementation ViewController
 14 
 15 - (void)viewDidLoad {
 16     [super viewDidLoad];
 17     // Do any additional setup after loading the view, typically from a nib.
 18     self.title = @"小飞哥键盘";
 19     self.textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 168, kScreenWidth - 100, 50)];
 20     self.textField.delegate = self;
 21     self.textField.backgroundColor = [UIColor greenColor];
 22     self.textField.placeholder = @"(默认系统键盘)";
 23     
 24     [self.view addSubview:self.textField];
 25     
 26     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hidenKeyBoard)];
 27     [self.view addGestureRecognizer:tap];
 28     
 29     UISegmentedControl *segment = [[UISegmentedControl alloc]  initWithItems:@[@"键盘1",@"键盘2",@"键盘3",@"系统键盘"]];
 30     segment.frame = CGRectMake(0, 100, kScreenWidth, 50);
 31     [segment addTarget:self action:@selector(keyBoardTypeAction:) forControlEvents:UIControlEventValueChanged];
 32     [self.view addSubview:segment];
 33     
 34 }
 35 
 36 - (void)keyBoardTypeAction:(id )sender
 37 {
 38     UISegmentedControl *seg = (UISegmentedControl *)sender;
 39     NSLog(@"intage = %ld", (long)seg.selectedSegmentIndex);
 40     
 41     if (seg.selectedSegmentIndex == 0) {
 42         self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@1];
 43         self.textField.inputView = self.xfg_keyboard;
 44         self.xfg_keyboard.delegate = self;
 45         [self.textField reloadInputViews];
 46     }
 47     if (seg.selectedSegmentIndex == 1) {
 48         self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@2];
 49         self.textField.inputView = self.xfg_keyboard;
 50         self.xfg_keyboard.delegate = self;
 51         [self.textField reloadInputViews];
 52     
 53     }
 54     
 55     if (seg.selectedSegmentIndex == 2) {
 56         self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@3];
 57         self.textField.inputView = self.xfg_keyboard;
 58         self.xfg_keyboard.delegate = self;
 59         [self.textField reloadInputViews];
 60     }
 61     
 62     if (seg.selectedSegmentIndex == 3) {
 63         self.textField.inputView = nil;
 64         [self.textField reloadInputViews];
 65     }
 66    
 67 }
 68 
 69 - (void)hidenKeyBoard
 70 {
 71     NSLog(@"键盘隐藏");
 72     [self.textField resignFirstResponder];
 73 }
 74 
 75 - (void)textFieldDidBeginEditing:(UITextField *)textField
 76 {
 77     NSLog(@"显示键盘");
 78 }
 79 
 80 - (void)numberKeyBoard:(NSInteger)number
 81 {
 82     NSString *str = self.textField.text;
 83     self.textField.text = [NSString stringWithFormat:@"%@%ld",str,(long)number];
 84 }
 85 
 86 - (void)cancelKeyBoard
 87 {
 88     
 89     NSMutableString *muStr = [[NSMutableString alloc] initWithString:self.textField.text];
 90     if (muStr.length <= 0) {
 91         return;
 92     }
 93     [muStr deleteCharactersInRange:NSMakeRange([muStr length] - 1, 1)];
 94     self.textField.text = muStr;
 95 }
 96 
 97 #pragma 输入点
 98 -(void)periodKeyBoard{
 99     
100     if ([self.textField.text isEqualToString:@""]) {
101         return;
102     }
103     
104     //判断当前时候存在一个点
105     if ([self.textField.text rangeOfString:@"."].location == NSNotFound) {
106         //输入中没有点
107         NSMutableString  *mutableString=[[NSMutableString alloc]initWithFormat:@"%@%@",self.textField.text,@"."];
108         self.textField.text=mutableString;
109     }
110 }
111 
112 -(void)changeKeyBoard{
113     
114     self.textField.inputView = nil;
115     [self.textField reloadInputViews];
116 }
117 
118 -(void)finishKeyBoard{
119     [self.view endEditing:YES];
120 }
121 
122 - (void)didReceiveMemoryWarning {
123     [super didReceiveMemoryWarning];
124     // Dispose of any resources that can be recreated.
125 }
126 
127 @end

 

转载于:https://www.cnblogs.com/iOS-liufei/p/5385917.html

相关文章:

  • Spring MVC中带有继承关系或者含有对象的参数请求处理方式
  • Tomcat部署时war和war exploded区别以及平时踩得坑
  • nodejs帮助学习地址
  • Linux操作系统安装ELK stack日志管理系统--(1)Logstash和Filebeat的安装与使用
  • 【笔记】js高级程序设计:函数(变量)声明提升
  • Linux操作系统安装ELK stack日志管理系统--(2)Elasticsearch与Kibana的安装与使用以及和Logstash的连接
  • IOS异步获取数据并刷新界面dispatch_async的使用方法
  • Redis实战和核心原理详解(6)使用Spring Session和Redis解决分布式Session跨域共享问题
  • Redis实战和核心原理详解(7)Spring Session解决分布式Session问题的实现原理
  • Redis实战和核心原理详解(2)Redis简介以及和其他缓存数据库的区别
  • 【vijos1642】班长的任务
  • Redis实战和核心原理详解(3)Redis常见的5种不同的数据类型详解
  • 类与类之间的几种关系
  • Redis实战和核心原理详解(8)使用快照RDB和AOF将Redis数据持久化到硬盘中
  • 复利(结对2.0)
  • Docker容器管理
  • HTML中设置input等文本框为不可操作
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript学习总结——原型
  • JDK 6和JDK 7中的substring()方法
  • JS学习笔记——闭包
  • Kibana配置logstash,报表一体化
  • maya建模与骨骼动画快速实现人工鱼
  • Objective-C 中关联引用的概念
  • opencv python Meanshift 和 Camshift
  • session共享问题解决方案
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 分享几个不错的工具
  • 聊聊redis的数据结构的应用
  • 配置 PM2 实现代码自动发布
  • 使用common-codec进行md5加密
  • 说说动画卡顿的解决方案
  • 听说你叫Java(二)–Servlet请求
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习Vue.js的五个小例子
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (day6) 319. 灯泡开关
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • ***测试-HTTP方法
  • .net 4.0发布后不能正常显示图片问题
  • .NET 8.0 发布到 IIS
  • .NET CF命令行调试器MDbg入门(一)
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net 路由处理厉害了
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net连接oracle数据库
  • .pub是什么文件_Rust 模块和文件 - 「译」