iPhoneX和iPhone 8的键盘高度不同

时间:2017-09-26 07:42:02

标签: ios iphone-x

我使用下面的代码来获得键盘高度。然后使用此高度计算UIView的帧,以确保此UIView位于键盘顶部。

但在iPhoneX模拟器中,输出为333,iPhone 8模拟器为258

问题:如果使用rect.height作为iPhone 8模拟器的键盘高度,那么布局是正确的。对于iPhone X,UIView和键盘之间存在差距。这意味着333高于iPhone X中的实际键盘高度。

高度的原因是什么?以及如何获得正确的键盘高度?

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


@objc func keyboardWillShow(_ notification: NSNotification) {
        if let rect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
           print(rect.height)
        } 
    }

像这张图片一样,绿色边框应该是额外的部分。实际上,我需要键盘顶部的红色部分没有绿色矩形间隙。 enter image description here

修改

好的,在@ Craig的帮助下,我发现这种方法只能由iPhone X调用。所以我在这里更新帧。只需在此处粘贴代码即可。

安全区底部高度22.0似乎不正确。

override func viewSafeAreaInsetsDidChange() {
    if #available(iOS 11.0, *) {
        super.viewSafeAreaInsetsDidChange()
        view.safeAreaInsets.bottom // This value is the bottom safe area place value.
    }
}

EDIT2 通常view.safeAreaInsets.bottom应该是34.0,但如果你使用的是容器视图,那么这个值可能会有所不同,就像我的22.0。

5 个答案:

答案 0 :(得分:38)

虽然Craig's answer是正确的,但您可能不希望将视图固定到 view.bottom bottomLayoutGuide 而不是安全区域底部(特别是如果您的键盘并非总是打开,并且您不希望您的视图覆盖主页指示器区域。)

以下是针对这些案例的修复方法。它从键盘的高度减去安全区域底部插入的高度:

var keyboardHeight = ... // Get the keyboard height from keyboard notification

if #available(iOS 11.0, *) {
    let bottomInset = view.safeAreaInsets.bottom
    keyboardHeight -= bottomInset
}

答案 1 :(得分:34)

iPhone X和iPhone 8的键盘高度应该是正确的。我只能猜测你的代码中可能存在查找" red part"的问题,你的假设是键盘高度不正确而问题实际上是在位置观点。现在 - 位置问题的原因?我的第二个猜测是红色部分被固定到底部安全区域布局指南,它在iPhone 8上是0,但在iPhone X上是嵌入34点。

请参阅此图片,以说明键盘高度的差异,并且可以使用NSNotificationkeyboardWillShow报告的键盘高度键盘高度在键盘上方绘制一个矩形方法:

enter image description here

如果您想分享您的代码/约束以定位红色视图,我应该能够向您展示问题。

- 编辑:对于有兴趣知道如何提取红色矩形的人,我会在博文here中进入。

答案 2 :(得分:3)

目前为止,该功能适用​​于所有设备和iOS版本

- (void)keyboardWillShown:(NSNotification*)aNotification
{
        NSDictionary* info = [aNotification userInfo];
        CGFloat kbHeight = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
        CGFloat safeAreaBottomInset = 0;
        if (@available(iOS 11.0, *)) {
            safeAreaBottomInset = self.view.safeAreaInsets.bottom;
        }
        self.containerViewBottomConstraint.constant += (kbHeight - safeAreaBottomInset); //In my case I use a constraint to adapt the UI when the keyboard is presented
        [self.view layoutIfNeeded];
}

答案 3 :(得分:0)

我也遇到了这个问题。我所做的只是检查了iPhone 7和iPhone X上不同的键盘。我只是在键盘高度上添加了一些默认边距。现在,它可以在所有设备上正常工作。

答案 4 :(得分:0)

覆盖func viewDidLoad(){         super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
//Here keyboard is without any toolbar and suggestions boxes
@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardHeight = ((keyboardSize.height) > 240) ? 220 :  (keyboardSize.height - 47)
        self.view.layoutIfNeeded()
    }

}