IOS - 键盘处理
iOS 发布了很多关于屏幕上键盘的通知。下面列出了这些通知的简要解释:
UIKeyboardWillShowNotification
当键盘即将要显示的时候将会发出这个通知。这个通知包含了用户信息库,库里面包括了键盘的各种 信息,键盘将以动画的形式显示在屏幕上。
UIKeyboardDidShowNotification
当键盘显示在屏幕上时将发出这个通知。
UIKeyboardWillHideNotification
当键盘将要从屏幕上移除时将会发出此通知。通知里包含了用户信息库,库里包括了各种关于键盘信 息的详细信息,当键盘隐藏时的动画,动画的持续时间,等等。
UIKeyboardDidHideNotification
当键盘完全隐藏后将发出此通知。
正如前面所提到的,只有 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 这两个通知
携带了用户信息。下面是这些信息的关键字,也许这对你有用。
UIKeyboardAnimationCurveUserInfoKey
这个关键字的值指明了动画的类型,用来显示和隐藏键盘。这个关键字包含了一个 NSNumber 类型的值, 此类型包含了一个NSUInteger 类型无符号整数
UIKeyboardAnimationDurationUserInfoKey 这个键值指明了键盘显示或隐藏的动画所用的时间。这个键包含一个 NSNumber 类型的值,此类包
含一个 double 类型的双字节值。
UIKeyboardFrameBeginUserInfoKey
这个键值指明了键盘在动画之前的框架。假如键盘将要显示时,在显示之前将这个框架传递给这个动 画。假如键盘已经显示了并即将要隐藏时,这个框架将会传递给这个隐藏动画,在键盘消失之前。这个键包含 了一个 CGRect 类型的值。
UIKeyboardFrameEndUserInfoKey
这个键值指明了动画完成后的键盘框架。假如键盘即将要显示时,这个框架将会在键盘完全显示后传递给键盘。。假如键盘已经完全显示,而且将要隐藏时,在完全隐藏后这个框架将会传递给键盘。这个键值包 含了一个 CGRect 类型的值。
注:键盘框架
这个框架被作为 iOS 键盘以开始和结束来发布的,它不会考虑设备的方向。我们需要
将 CGRect 值转换成一个关于坐标的值,后面会提到。
iOS5之前,iPhone上的键盘的高度是固定为216.0px高的,中文
汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度。可是在iOS5中,键盘布局变了,尤其是中文输入时,中文汉字选择框就固定在键盘上方,
这样就使得原本与键盘紧密贴合的界面视图被中文汉字选择框给覆盖住了。一方面影响了界面的美观,另一方面,如果被覆盖的部分就是文本输入框的话,用户就无
法看到输入的内容了。因此这个问题就必须得解决了。
解决方法:
其实在一开始使用216.0px这个固定值来标注键盘的高度就是错误的。因为在iOS3.2以后的系统中,苹果就提供了键盘使用的api以及demo程序----"KeyboardAccessory"。
处理键盘事件的正确方法是这样的。(包括获取键盘的高度以及键盘弹出和消失动画的时间)
1)在要使用键盘的视图控制器中,接收键盘事件的通知:
- (void)viewDidLoad
{
[superviewDidLoad];
//键盘高度变化通知,ios5.0新增
#ifdef __IPHONE_5_0
float version = [[[UIDevicecurrentDevice] systemVersion]
floatValue];
if (version >=5.0)
{
[[NSNotificationCenterdefaultCenter]
addObserver:selfselector:@selector(keyboardWillShow:)
name:UIKeyboardWillChangeFrameNotificationobject:nil];
}
#endif
//键盘将要出现时的触发事件
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(keyboardWillShow:)name:UIKeyboardWillShowNotificationobject:nil];
//键盘将要消失时的触发事件
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(keyboardWillBeHidden:)name:UIKeyboardWillHideNotificationobject:nil];
}
获取键盘的动画参数:
NSDictionary *info = [notification userInfo];
NSTimeInterval duration = 0;
UIViewAnimationCurve curve;
[[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&duration];
[[info objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&curve];
2)然后添加键盘事件的处理代码:获取到当前keyboard的高度以及动画时间,然后对视图进行对应的操作即可。
-(void)keyboardWillShow:(NSNotification *)notification
{
NSDictionary *info = [notification
userInfo];
NSValue *value = [info
objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
CGSize keyboardSize = [value
CGRectValue].size;//获取键盘的size值
NSLog(@"value %@ %f",value,keyboardSize.height);
//获取键盘出现的动画时间
NSValue *animationDurationValue = [info
objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue
getValue:&animationDuration];
- keyboardSize.;
NSLog(@"height = %f",height);
NSTimeInterval animation = animationDuration;
//视图移动的动画开始
[UIViewbeginAnimations:nilcontext:nil];
[UIViewsetAnimationDuration:animation];
CGRect frame =CGRectMake(self.view.frame.origin.x,
height, self.view.frame.size.width,self.view.frame.size.height);
self.view.frame = frame;
[UIViewcommitAnimations];
}
-(void)keyboardWillBeHidden:(NSNotification *)aNotification
{
NSDictionary *info = [aNotification
userInfo];
NSValue *animationDurationValue = [info
objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue
getValue:&animationDuration];
NSTimeInterval animation = animationDuration;
[UIViewbeginAnimations:@"animal"context:nil];
[UIViewsetAnimationDuration:animation];
self.view.frame = [[UIScreenmainScreen]
bounds];
[UIViewcommitAnimations];
}
duration在默认【中文拼音输入法】弹出时,不能正确获取duration,需要加一行代码修正:
duration = (duration > 0 ? duration: 0.25);//已知,IOS5.0.1里面键盘弹出动画的0.25S的,瑕疵:如果这里动画时间不是0.25就有可能动画不同步了
键盘处于显示状态的UIViewController被UINavigationController pop出去时,也会发出 UIKeyboardWillHideNotification通知,只不过这个键盘隐藏的轨迹是【从左到右的滑动】而不是从上到下的收起。所以,如果想在这个通知的响应代码里去调整UI(比如恢复底部工具条的origin.y使其始终居于底部),应该避免横向滑动键盘消失这种情况。可以通过以下响应代码来鉴别是否横向滑动导致键盘消失:
NSDictionary *info = [notification userInfo];
CGPoint kbEndOrigin = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].origin;
if(kbEndOrigtin.x > 0) {//横向滑动导致了键盘消失,不必调整UI
return;
}
//恢复UI显示
3)在dealloc方法里,移除键盘事件的通知:
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
IOS - 键盘处理的更多相关文章
- iOS开发小技巧--iOS键盘 inputView 和 inputAccessoryView
iOS键盘 inputView 和 inputAccessoryView 1.inputAccessoryView UITextFields和UITextViews有一个inputAccessoryV ...
- IOS键盘弹出、隐藏
IOS键盘 UIKeyboardFrameBeginUserInfoKey:动画开始前键盘的size UIKeyboardFrameEndUserInfoKey:动画结束后键盘的size - (voi ...
- ios键盘弹起 body的高度拉长,页面底部空白问题。ios软键盘将页面抵到上面后,关闭软键盘页面不回弹的问题。
js 监听ios手机键盘弹起和收起的事件 /* js 监听ios手机键盘弹起和收起的事件 */ document.body.addEventListener('focusin', () => { ...
- iOS 键盘自适应(IQKeyboardManager)使用小结
IQKeyboardManager Github地址 经常在开发一个应用程序,我们遇到了一个问题,iPhone的键盘上滑覆盖的UITextField / UITextView.IQKeyboardMa ...
- iOS键盘中英文切换键盘高度获取通知方法
iOS键盘中英文切换键盘高度获取通知方法, 有需要的朋友可以参考下. 注册通知 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppea ...
- iOS 键盘遮挡输入框万能解决方案(多个输入框)
效果图如下: 思路分析: 代码: 知识点: 问题: 效果图如下: 思路分析: 当我们有很多输入框时,有时候键盘弹出来会遮挡着输入框.我们需要获取输入框和键盘相对于最外层视图的位置来判断是否遮挡,如果遮 ...
- h5页面ios键盘弹出收起后页面底部留白问题
<input placeholder="验证码" type="tel" v-model="verify" maxlength=&quo ...
- iOS键盘输入屏幕上移
在iOS开法中经常会遇到键盘遮挡屏幕的事情(比如输入账号密码验证码等等),就使得原本都不大的屏幕直接占了一半甚至更多的位置,这倒无所谓,关键是挡住了下面的按钮.这样的话按钮的事件也就触发不了,最好的解 ...
- iOS 键盘类型
版权声明:本文为博主原创文章.请尊重作者劳动成果,转载请注明出处. UIKeyboardTypeDefault: UIKeyboardTypeASCIICapable: UIKeyboardTypeN ...
随机推荐
- 清北学堂模拟day6 圆桌游戏
[问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...
- 分分钟教会大家第一个Spring入门案例
1.下载Spring jar包,并添加到项目中. 官网地址http:springsource.org 2.在项目中新建一个类 package cn.test; public class He ...
- flexbox-CSS3弹性盒模型flexbox完整版教程
原文链接:http://caibaojian.com/flexbox-guide.html flexbox-CSS3弹性盒模型flexbox完整版教程 A-A+ 前端博客•2014-05-08•前端开 ...
- Codeforces Round #335 Sorting Railway Cars 动态规划
题目链接: http://www.codeforces.com/contest/606/problem/C 一道dp问题,我们可以考虑什么情况下移动,才能移动最少.很明显,除去需要移动的车,剩下的车, ...
- iOS开发初级课程
iOS开发初级课程 针对学员 掌握Objective C,C或者C++,有语言基础的学员,想从事iOS开发工作. iOS开发那些事-了解iOS开发(8集) 在课程中,我们首先介绍如何使用nib和故事 ...
- 揭露QPS增高后的秘密
导读 很多人在实际的开发中害怕系统的QPS增高,因为觉得QPS太高会导致系统挂掉;基于这种心理会想着尽量的降低系统的请求量,甚至有人会将很多处理放置到服务中来处理,这样外部发一起请求,服务就把所有的业 ...
- 学习Node.js笔记(一)
一.什么是Node.js 1.1.Node.js是什么 Node.js是用来编写高性能网络服务器的JavaScript工具包 Node.js 是一个基于Chrome JavaScript 运行时建立的 ...
- VSSより、指定したファイルを取得するマクロ(パス入り)
Option Explicit'VSSのiniファイルの場所Private SRCSAFE_INI As String'VSS接続のユーザIDPrivate USER_ID As String'VSS ...
- ubuntu: NO_PUBKEY 8D5A09DC9B929006
最近使用ubuntu16.04时,运行 sudo apt-get update 时出现如下错误: W: GPG error: http://archive.ubuntukylin.com:10006/ ...
- 一个CMS案例实战讲解PHP代码审计入门
前言 php代码审计介绍:顾名思义就是检查php源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞. 1.环境搭建: 工欲善其事必先利其器,先介绍代码审计必要的环境搭建 审计环境 window ...