iPhoneX和iPhone 8的键盘高度不同

我使用下面的代码来获得键盘高度。 然后使用此高度计算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) } } 

像这张图片一样,绿色边框应该是额外的部分。 实际上,我需要键盘顶部的红色部分没有绿色矩形间隙。 在此处输入图像描述

编辑

好的,在@ 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。

iPhone X和iPhone 8的键盘高度应该是正确的。 我只能猜测你的代码中可能存在定位“红色部分”的问题,你的假设是键盘高度不正确,而问题实际上是在视图的位置 。 现在 – 位置问题的原因? 我的第二个猜测是红色部分固定在底部安全区域布局指南,其中iPhone 8为0,但在iPhone X上嵌入34点。

请参阅此图像以说明键盘高度的差异,并且可以使用键盘高度在键盘上方绘制一个矩形,使用键盘高度,该高度来自键盘高度,该高度来自于keyboardWillShow方法的NSNotification

在此处输入图像描述

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

虽然Craig的答案是正确的,但您可能不希望将视图固定在view.bottombottomLayoutGuide而不是安全区域底部 (特别是如果您的键盘并不总是打开,并且您不希望您的视图覆盖Home Indicator)区)。

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

 var keyboardHeight = ... // Get the keyboard height from keyboard notification if #available(iOS 11.0, *) { let bottomInset = view.safeAreaInsets.bottom keyboardHeight -= bottomInset }