You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:40:23