在iOS 9快捷工具栏模式下,与键盘顶部alignment的视图出现在错误的位置

iOS 9为iOS 8 QuickType栏添加了一个快捷工具 栏 。

作为此更改的一部分,如果将​​蓝牙键盘连接到iPad,则键盘处于最小化快捷方式栏模式(可通过在模拟器中按命令k进行模拟)。

我有代码获取键盘高度使用类似于以下方法:

CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGFloat keyboardHeight = keyboardFrame.size.height; // = 313 

问题是,当键盘在展开和折叠状态之间切换时,高度保持不变,导致我的视​​图出现在其旧位置:

期望的行为:

在这里输入图像说明
(注意红色视图是如何附加到键盘的顶部的)

实际行为:

在这里输入图像说明

将红色视图粘贴到键盘顶部的正确方法是什么?

问题是,大多数代码( 包括苹果)都忽略了UIKeyboardFrameEndUserInfoKeyCGRect而不是CGSize的事实

 // ❌ Bad code, do not use - (void)keyboardWasShown:(NSNotification*)aNotification { NSDictionary* info = [aNotification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; CGRect bkgndRect = activeField.superview.frame; bkgndRect.size.height += kbSize.height; [activeField.superview setFrame:bkgndRect]; [scrollView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES]; } 

在这里你看到只有键盘高度( kbSize.height )被使用。 协议的起源很重要,不应该被忽视。

当键盘可见时,这是报告的矩形:

在这里输入图像说明

当键盘处于仅快捷方式栏模式时,这是rect:

在这里输入图像说明

请注意,键盘的大部分是在屏幕外,但它仍然是一样的高度。

为了获得正确的行为,在视图中使用CGRectIntersection和视图边界以及键盘框架:

 // ✅ Good code, use CGRect keyboardScreenEndFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect keyboardViewEndFrame = [self.view convertRect:keyboardScreenEndFrame fromView:self.view.window]; CGRect keyboardFrame = CGRectIntersection(self.view.bounds, keyboardViewEndFrame); CGFloat keyboardHeight = keyboardFrame.size.height; // = 55 

出于同样的原因,应使用UIKeyboardFrameBeginUserInfoKey而不是UIKeyboardFrameBeginUserInfoKey