iPad设备旋转后UIKeyboard高度异常问题求助
解决iPad旋转后键盘高度获取错误的问题
嘿,这个问题我之前做iPad专属应用适配时也踩过坑!核心问题出在你用的UIKeyboardFrameBeginUserInfoKey和坐标系转换上,咱们一步步捋清楚解决方案:
问题根源
你用的UIKeyboardFrameBeginUserInfoKey返回的是键盘开始弹出瞬间的frame,这个frame是基于旋转前的界面方向生成的,完全没适配当前的屏幕朝向。而且iPad旋转后,屏幕坐标系的轴会翻转,直接取这个frame的height自然会得到错误数值——你看到的142其实是横屏时键盘的宽度,而非垂直方向的实际高度。
正确解决方案
1. 改用UIKeyboardFrameEndUserInfoKey获取最终键盘frame
这个key返回的是键盘完全弹出后的稳定frame,已经适配了当前的界面方向,是处理键盘布局时的首选。
2. 将键盘frame转换到当前视图坐标系
键盘的frame默认基于屏幕全局坐标系,旋转后直接取height可能不符合当前视图的垂直方向逻辑,所以需要把它转换到你操作的目标视图坐标系中。
完整代码示例
替换你原来的代码为:
guard let keyboardFrame = sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } // 将屏幕坐标系的键盘frame转换到当前视图的局部坐标系 let keyboardRectInView = view.convert(keyboardFrame.cgRectValue, from: nil) // 这里的height就是当前视图垂直方向上键盘占据的真实高度 let keyboardHeight = keyboardRectInView.height
额外优化:同步动画保证居中平滑
如果你需要在键盘弹出/隐藏的动画过程中同步调整视图位置(让居中效果更自然),可以结合键盘动画参数做同步动画:
guard let duration = sender.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? TimeInterval, let curveRawValue = sender.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as? UInt, let keyboardFrame = sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } let keyboardRectInView = view.convert(keyboardFrame.cgRectValue, from: nil) let keyboardHeight = keyboardRectInView.height UIView.animate(withDuration: duration, delay: 0, options: UIView.AnimationOptions(rawValue: curveRawValue)) { // 在这里更新你的视图居中逻辑,比如调整centerY偏移 yourCenteredView.center.y = self.view.center.y - keyboardHeight / 2 }
为什么这能解决问题?
UIKeyboardFrameEndUserInfoKey确保我们拿到的是键盘最终稳定后的位置,完全适配了当前屏幕旋转后的方向。view.convert(_:from:)把全局坐标系的frame转换成当前视图的局部坐标系,这样获取的height就是当前视图垂直方向上键盘的实际高度,不会因为屏幕旋转出现数值错乱。
内容的提问来源于stack exchange,提问作者Noroxs
相关产品推荐
相关产品推荐

