【iOS自定义键盘及键盘切换】详解
【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自定义键盘及键盘切换】详解的更多相关文章
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- iOS开发--常用技巧 (MJRefresh详解)
iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...
- iOS学习——(转)UIResponder详解
本文转载自:ios开发 之 UIResponder详解 我们知道UIResponder是所有视图View的基类,在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,包括触摸事件( ...
- iOS学习——iOS项目Project 和 Targets配置详解
最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理.我们iOS项目的开发 ...
- iOS开发之UITextField的使用详解
UITextField的使用详解 UITextField控件是开发中,使用频率比较高的控件了,那么有必要总结一下. 一.UITextField手动编写控件 UITextField *txtAccou ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
- cocos2dx-3.x 导出自定义类到 lua 过程详解
转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...
- iOS开发——UI篇OC&transform详解
transframe属性详解 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基 ...
- iOS开发——屏幕适配篇&Masonry详解
Masonry详解 前言 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-ip ...
- ios开发——实战OC篇&FMDB详解
FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...
随机推荐
- RabbitMQ修改端口号和心跳时间
定读者正在Windows系列的操纵体系中装置好了Rabbit MQ后,请找到装置途径下的etc文件夹下,将rabbitmq.config.example备份一份,并点窜为config范例的文件,即为] ...
- CSS背景background、background-position使用详解
背景(background)是css中一个重要的的部分,也是需要知道的css的基础知识之一.这篇文章将会涉及css背景(background)的基本用法,包括诸如 background-attachm ...
- php php-5.6.4.tar.bz2 apache 兼容问题 child pid 27858 exit signal Segmentation fault
环境 [root envirotar]# uname -a Linux i2..el6.x86_64 # SMP Thu Jul :: UTC x86_64 x86_64 x86_64 GNU/Lin ...
- logging 文件日志
1. 例子 import logging logging.basicConfig(filename='log.txt', #文件名 level=logging.DEBUG, #级别 format=u' ...
- 目标电脑未安装VC++6.0或者VS,运行APP丢失DLL问题解决办法
一.背景 VS或者VC++6.0编译出来的程序需要在未安装VS/VC++6.0的电脑上跑,很大情况会出现MSVCRXXX.dll 或者其他DLL丢失的情形,本篇就DLL相关问题做个记录. 二.正文 1 ...
- 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理
题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...
- 手机电脑Mac地址修改方法
1.什么是Mac地址? MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在O ...
- Linux学习之六--unZip/Zip的安装及使用
Linux系统没有自带的压缩解压工具:需要我们自己安装:当用到zip或者unzip如果没有安装就会出现unzip: Command Not Found 或 zip: Command Not Found ...
- es6中的promise对象
Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...
- java基础 swing编程实战
1. 实现金山词霸,点击左右收缩 效果图: exmaple code : /* * 词霸 * */ package demo7; import java.awt.*; import java.awt. ...