在iOS 9快捷工具栏模式下,与键盘顶部alignment的视图出现在错误的位置
iOS 9为iOS 8 QuickType栏添加了一个快捷工具 栏 。
作为此更改的一部分,如果将蓝牙键盘连接到iPad,则键盘处于最小化快捷方式栏模式(可通过在模拟器中按命令k进行模拟)。
我有代码获取键盘高度使用类似于以下方法:
CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGFloat keyboardHeight = keyboardFrame.size.height; // = 313
问题是,当键盘在展开和折叠状态之间切换时,高度保持不变,导致我的视图出现在其旧位置:
期望的行为:
(注意红色视图是如何附加到键盘的顶部的)
实际行为:
将红色视图粘贴到键盘顶部的正确方法是什么?
问题是,大多数代码( 包括苹果)都忽略了UIKeyboardFrameEndUserInfoKey是CGRect而不是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
。