Swift中如何获取iPhone X键盘真实尺寸?尺寸异常问题求解
解决iPhone X上键盘尺寸获取不一致的问题
这个问题我做iOS开发时也碰到过,核心原因是你用错了键盘通知里的关键key——UIKeyboardFrameBeginUserInfoKey拿到的是键盘开始执行显示动画那一刻的初始帧,而不是它最终停留在屏幕上的真实尺寸!
为什么会出现尺寸差异?
- 第一次弹出键盘时,键盘是从屏幕底部外侧滑入,此时
UIKeyboardFrameBeginUserInfoKey返回的初始帧y坐标是屏幕高度(812),高度291其实是键盘的真实高度,但这只是动画开始前的位置。 - 当键盘消失后再次弹出,系统可能复用了已存在的键盘实例,它的初始位置不再是屏幕外,所以
UIKeyboardFrameBeginUserInfoKey返回的帧就和真实显示的尺寸不符了。
正确获取键盘真实尺寸的方法
方法1:改用UIKeyboardFrameEndUserInfoKey(兼容所有iOS版本)
这个key返回的是键盘动画结束后的最终显示帧,这才是你需要的真实尺寸。同时记得把键盘的屏幕坐标系帧转换到当前视图的坐标系,避免屏幕旋转时出现错误:
@objc func handleKeyboardNotification(_ notification: Notification) { // 获取键盘动画结束后的最终帧 guard let keyboardFrameValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } let keyboardScreenRect = keyboardFrameValue.cgRectValue // 转换到当前视图的坐标系 let keyboardViewRect = view.convert(keyboardScreenRect, from: view.window) let realKeyboardHeight = keyboardViewRect.height print("真实键盘高度:\(realKeyboardHeight)") }
方法2:iOS 13+ 推荐使用UIKeyboardLayoutGuide
iOS 13及以上版本提供了更简洁的方式,不需要监听通知,系统会自动处理键盘的位置和尺寸变化:
override func viewDidLoad() { super.viewDidLoad() // 自动适配键盘(比如让输入框紧贴键盘顶部) yourTextField.bottomAnchor.constraint(equalTo: view.keyboardLayoutGuide.topAnchor, constant: 8).isActive = true // 如果需要主动获取键盘高度,监听布局变化 NotificationCenter.default.addObserver(forName: NSNotification.Name.UIContentSizeCategoryDidChange, object: nil, queue: .main) { [weak self] _ in guard let self = self else { return } print("当前键盘高度:\(self.view.keyboardLayoutGuide.layoutFrame.height)") } }
额外注意事项
- 不要忘记在
deinit里移除通知监听,避免内存泄漏。 - 如果你的App支持屏幕旋转,一定要做坐标系转换,否则拿到的尺寸会和当前视图的布局不匹配。
内容的提问来源于stack exchange,提问作者user9494956
相关产品推荐
相关产品推荐

