UIKeyboardWillShowNotification与ios 11 beta 7有关

时间:2017-08-28 14:07:08

标签: ios objective-c keyboard ios11

在iOS 11 beta 7上测试我的应用程序 - 如果我的UIViewController,键盘似乎没有推高内容。

代码看起来像这样(从iOS7开始工作):

- (void)handleNotification:(NSNotification*)notification {
if (notification.name == UIKeyboardWillShowNotification) {
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    nextButtonALBottomDistance.constant = keyboardSize.height + initialPhoneBottomDistance;
    codeBottomViewALBottomDistance.constant = keyboardSize.height + initialCodeBottomDistance;
    double animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];
}
else if (notification.name == UIKeyboardWillHideNotification) {
    nextButtonALBottomDistance.constant = initialPhoneBottomDistance;
    codeBottomViewALBottomDistance.constant = initialCodeBottomDistance;
    double animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];
}

}

有趣的是 - 当我按下主页按钮(最小化应用程序)并重新打开它(没有杀死它)时 - 布局是固定的。

这似乎是一个iOS 11测试版的错误,但到目前为止我找不到它的任何参考。

很高兴知道其他人是否有这个问题。

3 个答案:

答案 0 :(得分:10)

使用 UIKeyboardFrameEndUserInfoKey ,因为该键适用于包含CGRect的NSValue对象,该CGRect用于在屏幕坐标中标识键盘的结束帧。 不要使用UIKeyboardFrameBeginUserInfoKey

答案 1 :(得分:3)

如果您使用 UIKeyboardFrameBeginUserInfoKey 键获取键盘高度,请将其替换为 UIKeyboardFrameEndUserInfoKey 以获取正确的密码键盘高度。

在iOS 11中, UIKeyboardFrameBeginUserInfoKey 键的帧的高度值为0,因为它是一个起始帧。要获得实际高度,我们需要结束帧,并且 UIKeyboardFrameEndUserInfoKey 返回结束帧。

请参阅管理键盘documentation

  

UIKeyboardFrameBeginUserInfoKey   包含a的NSValue对象的键   标识起始帧的CGRect   屏幕坐标中的键盘   这些坐标不需要考虑   应用任何轮换因素   因此,窗口的内容   界面方向的变化。   因此,您可能需要转换   矩形到窗口坐标(使用   convertRect:fromWindow:method)或   查看坐标(使用   convertRect:fromView:method)之前   使用它。

     

UIKeyboardFrameEndUserInfoKey 密钥   对于包含a的NSValue对象   标识结束框的CGRect   屏幕坐标中的键盘   这些坐标不需要考虑   应用任何轮换因素   因此,窗口的内容   界面方向的变化。   因此,您可能需要转换   矩形到窗口坐标(使用   convertRect:fromWindow:method)或   查看坐标(使用   convertRect:fromView:method)之前   使用它。

答案 2 :(得分:1)

我也遇到了这个非运动问题。我怀疑开始&结束帧总是不正确的,因为它们是相同或几乎相同的,但最近在iOS 11中被修复,因此打破了很多代码,这些代码并没有真正理解这两个帧之间的差异。

根据此处的信息 https://stackoverflow.com/a/14326257/5282052

开始是键盘开始看起来像,大多数人不想要的。 结束是键盘外观的结果,这是大多数人唯一关心的问题。

[[[user userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] .size;

确实通过滚动视图的ZERO运动解决了我的问题。