2.29 Listening and Reacting to Keyboard Notifications

 

监听键盘消息

当我们需要输入文本时,如果输入框比较靠屏幕下方,则弹出的键盘会遮住输入框。这样的输入体验想必没人喜欢。我们怎么在键盘弹出时调整输入框的位置,已使用户获得更好的输入体验。
当然了解决的办法就是监听键盘消息,键盘弹出时把屏幕往上移一移

<一>
IOS会发出许多键盘显示消息,如下:
UIKeyboardWillShowNotification 键盘要弹出来了
UIKeyboardDidShowNotification  键盘弹出完毕
UIKeyboardWillHideNotification 键盘要缩回去了
UIKeyboardDidHideNotification 键盘缩回完毕

<二>
UIKeyboardWillShowNotification,UIKeyboardWillHideNotification 消息
这两个消息携带了UserInfo dictionary,这个dictionary带了如下几个键值:

UIKeyboardAnimationCurveUserInfoKey
 这个键的值是一个NSNumber类型的对象,包含了NSUInteger数据,用于指明animation curve类型。

UIKeyboardAnimationDurationUserInfoKey
 这个值指明键盘弹出,缩回需要用多长时间

UIKeyboardFrameBeginUserInfoKey
 这个值指明动画开始前键盘的Frame。如果是键盘弹出,则是键盘弹出前的frame。如果是键盘缩回,则是缩回前的frame,即键盘在屏幕上显示的frame。这个值包含了一个CGRect类型的数据。(这里的frame未经过坐标系转换)

UIKeyboardFrameEndUserInfoKey
 这个值指明动画结束后键盘的Frame。如果是键盘弹出,则是键盘弹出后的frame,即键盘在屏幕上显示的frame。如果是键盘缩回,则是缩回后的frame。这个值包含了一个CGRect类型的数据。(这里的frame未经过坐标系转换)

<三>
注册消息通知
//书上代码
- (void) viewDidAppear:(BOOL)paramAnimated{
[super viewDidAppear:paramAnimated];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(handleKeyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[center addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void) viewDidDisappear:(BOOL)paramAnimated{
[super viewDidDisappear:paramAnimated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

我们应该在viewDidAppear:  viewDidDisappear: 注册和删除消息通知。
有些人可能会在viewDidLoad viewDidUnload 或 dealloc中注册和删除消息通知。但不应如此,因为这会导致我们的view不在Screen上时也会响应消息通知。也就是说让一个被隐藏掉的view来相应键盘通知,并调整view的布局,这是不应该发生的。
好了,我们已经收到键盘消息通知了,接下来该响应通知了。

<四>

我们可以通过UIKeyboardWillShowNotification notification的值或者键盘弹出过程中动画的时间,曲线,和最后的位置大小。从而可以计算出我们的view应该往上缩回去多少,并通过上面计算出来的时间和曲线,让我们的视图的动画过程和键盘的弹出过程完美同步。当然一般情况下我们不是重新设置view的frame,而是设置view的contentInset。

<五>
旋转设备对键盘弹出frame的影响。
我们都知道旋转设备后,弹出的键盘的尺寸与竖直方向的键盘的frame是不一样的。需要注意的是,这不仅仅是宽高和起点不一样而已。他们的坐标系也是不一样的。如果我们直接打印键盘的frame,我们会发现在竖直方向时为{{0, 264}, {320, 216}},旋转后却是{{0, 0}, {162, 480}}。起点是{0,0},是旋转后的左上角吗?不是,是旋转前的左上角。此时,我们界面视图的坐标系与键盘的坐标系是不同一个的。因此我们需要把它转化一下[self.view convertRect:keyboardEndRect fromView:window];

<六>
你是否在iPad用过Split键盘,键盘被分成两部分,分别由左右手来输入。是不是很cool呢。不过这不是我们要关心的,我们关心的是:这时在弹出键盘时,它的frame是多少;我们怎么根据frame来调整界面布局?很抱歉的告诉你,在我写的例子中,在弹出这种键盘时,我没有收到键盘弹出消息,这种情况下也不需要去相应键盘弹出消息,不是么?

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值