我使用下面的代码来获得键盘高度。然后使用此高度计算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。
答案 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点。
请参阅此图片,以说明键盘高度的差异,并且可以使用NSNotification
中keyboardWillShow
报告的键盘高度键盘高度在键盘上方绘制一个矩形方法:
如果您想分享您的代码/约束以定位红色视图,我应该能够向您展示问题。
- 编辑:对于有兴趣知道如何提取红色矩形的人,我会在博文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()
}
}