在iOS 9仅限快捷栏模式下,与键盘顶部对齐的视图显示在错误的位置

Sen*_*ful 4 keyboard ipad ios ios9

iOS 9 在iOS 8 QuickType栏中添加了一个快捷.

作为此更改的一部分,如果您将蓝牙键盘连接到iPad,则键盘处于最小化的仅限快捷栏模式(可以通过在模拟器中按下命令-k来模拟).

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

CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardFrame.size.height; // = 313
Run Code Online (Sandbox Code Playgroud)

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

期望的行为:

在此输入图像描述
(注意红色视图如何附加到键盘顶部)

实际行为:

在此输入图像描述

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

Sen*_*ful 15

问题是大多数代码(包括 Apple的代码)忽略了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];
}
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到只使用了键盘高度(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
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,UIKeyboardFrameEndUserInfoKey应该使用相反的UIKeyboardFrameBeginUserInfoKey.