【iOS自定义键盘】详解

实现效果展示:

一、实现的协议方法代码

 #import <UIKit/UIKit.h>

 //创建自定义键盘协议
@protocol XFG_KeyBoardDelegate <NSObject>
//创建协议方法
@required//必须执行的方法
- (void)numberKeyBoard:(NSInteger) number;
- (void)cancelKeyBoard;
- (void)finishKeyBoard;
- (void)periodKeyBoard;
- (void)changeKeyBoard;
@optional//不必须执行方法 @end @interface XFG_KeyBoard : UIView
{
@private//私有的协议方法
id<XFG_KeyBoardDelegate> _delegate;
} @property (nonatomic, strong) id<XFG_KeyBoardDelegate> delegate; - (id)initWithNumber:(NSNumber *)number;
@end

二、自定义键盘创建

 #import "XFG_KeyBoard.h"
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height @implementation XFG_KeyBoard - (id)initWithNumber:(NSNumber *)number
{
self = [super init];
if (self) { self.backgroundColor = [UIColor greenColor];
self.frame = CGRectMake(, kScreenHeight - , kScreenHeight, );
if ([number isEqualToNumber:@]) { [self initKeyBoardNumber_1];
} else if ([number isEqualToNumber:@]){ [self initKeyBoardNumber_2];
} else if ([number isEqualToNumber:@]){ [self initKeyBoardNumber_3];
}
} return self;
} #pragma 键盘1自定义视图
- (void)initKeyBoardNumber_1
{
self.frame=CGRectMake(, kScreenHeight-, kScreenWidth, );
int space=;
for (int i=; i<; i++) {
NSString *str=[NSString stringWithFormat:@"%d",i+];
UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
if (i<) {
button.frame=CGRectMake(i%*(kScreenWidth/)+space, i/*, kScreenWidth/-, );
}
else{
button.frame=CGRectMake(i%*(kScreenWidth/)+space, i/*+i/*space, kScreenWidth/-, );
}
button.backgroundColor=[UIColor whiteColor];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.titleLabel.font=[UIFont systemFontOfSize:];
[button setTitle:str forState:UIControlStateNormal];
button.tag=i+;
[button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
}
UIButton *dian=[UIButton buttonWithType:UIButtonTypeSystem];
dian.frame=CGRectMake(space,*+ , kScreenWidth/-, );
dian.backgroundColor=[UIColor whiteColor];
[dian setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
dian.titleLabel.font=[UIFont systemFontOfSize:];
[dian addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[dian setTitle:@"." forState:UIControlStateNormal];
dian.tag=;
[self addSubview:dian];
UIButton *ling=[UIButton buttonWithType:UIButtonTypeSystem];
ling.frame=CGRectMake(kScreenWidth/+*space,*+, kScreenWidth/-, );
ling.backgroundColor=[UIColor whiteColor];
[ling setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
ling.titleLabel.font=[UIFont systemFontOfSize:];
[ling setTitle:@"" forState:UIControlStateNormal];
ling.tag=;
[ling addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:ling]; UIButton *computer=[UIButton buttonWithType:UIButtonTypeSystem];
computer.frame=CGRectMake(kScreenWidth/*+space,*+, kScreenWidth/-, );
computer.backgroundColor=[UIColor whiteColor];
[computer setTitle:@"系统键盘" forState:UIControlStateNormal];
computer.tag=;
[computer addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:computer]; UIButton *delete=[UIButton buttonWithType:UIButtonTypeSystem];
delete.frame=CGRectMake(kScreenWidth/*+space,, kScreenWidth/-, );
[delete addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
delete.tag=; UIImageView *deleteImage=[[UIImageView alloc]initWithFrame:CGRectMake((kScreenWidth/- - ) * 1.0 / , , , )];
deleteImage.image=[UIImage imageNamed:@"goumai_03"];
[delete addSubview:deleteImage]; // [delete setBackgroundImage:[UIImage imageNamed:@"goumai_03"] forState:UIControlStateNormal];
[self addSubview:delete]; UIButton *confirm=[UIButton buttonWithType:UIButtonTypeSystem];
confirm.frame=CGRectMake(kScreenWidth/*+space,*, kScreenWidth/-, );
confirm.backgroundColor=[UIColor blueColor];
[confirm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
confirm.titleLabel.font=[UIFont systemFontOfSize:];
[confirm setTitle:@"确 定" forState:UIControlStateNormal];
[confirm addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
confirm.tag=;
[self addSubview:confirm];
} #pragma 键盘2自定义视图
- (void)initKeyBoardNumber_2
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(, , kScreenWidth - , )]; button.backgroundColor = [UIColor grayColor];
button.titleLabel.font = [UIFont systemFontOfSize:];
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
button.tag = ;
[button setTitle:@"" forState:UIControlStateNormal]; UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, , , )]; cancel.backgroundColor = [UIColor yellowColor];
cancel.titleLabel.font = [UIFont systemFontOfSize:];
[cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:cancel];
cancel.tag = ;
[cancel setTitle:@"删 除" forState:UIControlStateNormal];
} #pragma 键盘3自定义视图
- (void)initKeyBoardNumber_3
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(, , kScreenWidth - , )]; button.backgroundColor = [UIColor purpleColor];
button.titleLabel.font = [UIFont systemFontOfSize:];
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
button.tag = ;
[button setTitle:@"" forState:UIControlStateNormal]; UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, , , )]; cancel.backgroundColor = [UIColor yellowColor];
cancel.titleLabel.font = [UIFont systemFontOfSize:];
[cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:cancel];
cancel.tag = ;
[cancel setTitle:@"删 除" forState:UIControlStateNormal];
} #pragma 键盘点击按钮事件
- (void)keyBoardAciont:(UIButton *)sender
{ UIButton* btn = (UIButton*)sender; NSInteger number = btn.tag; // no delegate, print log info
if (nil == _delegate) {
NSLog(@"button tag [%ld]",(long)number);
return;
} if (number <= && number >= ) {
[_delegate numberKeyBoard:number];
return;
} if ( == number) {
[_delegate cancelKeyBoard];
return;
}
if ( == number) {
[_delegate periodKeyBoard];
return;
}
if ( == number) {
[_delegate changeKeyBoard];
return;
} if ( == number) {
[_delegate finishKeyBoard];
return;
} } @end

三、自定义键盘运用

 #import "ViewController.h"
#import "XFG_KeyBoard.h"
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height @interface ViewController ()<UITextFieldDelegate, XFG_KeyBoardDelegate> @property (nonatomic, strong) XFG_KeyBoard *xfg_keyboard;
@property (nonatomic, strong) UITextField *textField;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.title = @"小飞哥键盘";
self.textField = [[UITextField alloc] initWithFrame:CGRectMake(, , kScreenWidth - , )];
self.textField.delegate = self;
self.textField.backgroundColor = [UIColor greenColor];
self.textField.placeholder = @"(默认系统键盘)"; [self.view addSubview:self.textField]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hidenKeyBoard)];
[self.view addGestureRecognizer:tap]; UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:@[@"键盘1",@"键盘2",@"键盘3",@"系统键盘"]];
segment.frame = CGRectMake(, , kScreenWidth, );
[segment addTarget:self action:@selector(keyBoardTypeAction:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:segment]; } - (void)keyBoardTypeAction:(id )sender
{
UISegmentedControl *seg = (UISegmentedControl *)sender;
NSLog(@"intage = %ld", (long)seg.selectedSegmentIndex); if (seg.selectedSegmentIndex == ) {
self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@];
self.textField.inputView = self.xfg_keyboard;
self.xfg_keyboard.delegate = self;
[self.textField reloadInputViews];
}
if (seg.selectedSegmentIndex == ) {
self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@];
self.textField.inputView = self.xfg_keyboard;
self.xfg_keyboard.delegate = self;
[self.textField reloadInputViews]; } if (seg.selectedSegmentIndex == ) {
self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@];
self.textField.inputView = self.xfg_keyboard;
self.xfg_keyboard.delegate = self;
[self.textField reloadInputViews];
} if (seg.selectedSegmentIndex == ) {
self.textField.inputView = nil;
[self.textField reloadInputViews];
} } - (void)hidenKeyBoard
{
NSLog(@"键盘隐藏");
[self.textField resignFirstResponder];
} - (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"显示键盘");
} - (void)numberKeyBoard:(NSInteger)number
{
NSString *str = self.textField.text;
self.textField.text = [NSString stringWithFormat:@"%@%ld",str,(long)number];
} - (void)cancelKeyBoard
{ NSMutableString *muStr = [[NSMutableString alloc] initWithString:self.textField.text];
if (muStr.length <= ) {
return;
}
[muStr deleteCharactersInRange:NSMakeRange([muStr length] - , )];
self.textField.text = muStr;
} #pragma 输入点
-(void)periodKeyBoard{ if ([self.textField.text isEqualToString:@""]) {
return;
} //判断当前时候存在一个点
if ([self.textField.text rangeOfString:@"."].location == NSNotFound) {
//输入中没有点
NSMutableString *mutableString=[[NSMutableString alloc]initWithFormat:@"%@%@",self.textField.text,@"."];
self.textField.text=mutableString;
}
} -(void)changeKeyBoard{ self.textField.inputView = nil;
[self.textField reloadInputViews];
} -(void)finishKeyBoard{
[self.view endEditing:YES];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @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. Git学习笔记

    1.第一次提交文件的过程:     1)创建代码库:cd到要作为git代码库的文件夹下,执行git init命令.     2)设置邮箱和用户名:设置后才可提交代码,git config user.e ...

  2. 语言模型kenlm的训练及使用

    一.背景 近期研究了一下语言模型,同事推荐了一个比较好用的工具包kenlm,记录下使用过程. 二.使用kenlm训练 n-gram 1.工具介绍:http://kheafield.com/code/k ...

  3. Servlet和CGI的区别

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销 ...

  4. axios基本用法

    vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...

  5. Eclipse使用Maven tomcat:run命令启动web项目时修改默认端口

  6. Javascript模块化编程(一):模块的写法

    Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...

  7. ubuntu15:10 163源

    sudo vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ wily main restricted universe mult ...

  8. C#夯实基础之接口(《CLR via C#》读书笔记)

    一. 接口的类型 接口是引用类型.因此从值类型赋值给接口是需要装箱的.如下所示: class Program { static void Main(string[] args) { ISay catS ...

  9. Saving the entire git diff between two commits in a text file

    git diff A10..A1 > my.diff 转自: http://stackoverflow.com/questions/19067896/saving-the-entire-git- ...

  10. git: fatal: Not a git repository (or any of the parent directories): .git

    在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 ...