【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. Standard C 语言标准函数库介绍

    全面巩固所知所学,往精通方向迈进! Standard C 语言标准函数库速查 (Cheat Sheet) from:http://ganquan.info/standard-c/function/ C ...

  2. java的锁机制

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

  3. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  4. MVC开发模式下的用户角色权限控制

    前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...

  5. word20161223

    UAM, user authentication module / 用户身份验证模块 UBR, unspecified bit rate / 未指定的传输率 UCS, Unicode Characte ...

  6. ubuntu15:10 163源

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

  7. 【项目】百度搜索广告CTR预估

    -------倒叙查看本文. 6,用auc对测试的结果进行评估: auc代码如下: #!/usr/bin/env python import sys def auc(labels,predicted_ ...

  8. 关于清除arp 缓存的那点事儿

    在Linux下,清除arp缓存表,例如: arp -d 10.0.3.6 我们可以用上面这条命令清除某一条记录,也可以用 arp -n |awk '/^[1-9]/{print "arp - ...

  9. erlang 健壮性

    erlang 提供了简单易用的并发编程模型,基本不需要再考虑多线程并发问题.但实际应用中并不是那么的完美,很多地方需要注意,就算标准库也有不少问题.很多在多线程编程中很多很容易解决的事情,在erlan ...

  10. Java内存管理及GC算法

    概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...