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

UIInputViewController自定义键盘如何通过UIScreen.main.bounds计算安全区域

自定义键盘安全区域尺寸计算方案

正确获取安全区域边界的方法

开发自定义键盘时不要依赖UIScreen.main的尺寸属性计算布局,UIInputViewController的根view会自动适配当前设备的横竖屏、安全区域规则,直接基于该view的属性计算即可:

  1. 建议在viewDidLayoutSubviews生命周期中执行计算,此时布局参数已经更新,取值准确
  2. 基于根view的安全区域内边距,计算得到可用的安全区域frame,示例代码如下:
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // 获取当前键盘根视图的安全区域内边距
    let safeAreaInsets = self.view.safeAreaInsets
    // 计算安全区域的实际可用frame
    let safeAreaFrame = CGRect(
        x: safeAreaInsets.left,
        y: safeAreaInsets.top,
        width: self.view.bounds.width - safeAreaInsets.left - safeAreaInsets.right,
        height: self.view.bounds.height - safeAreaInsets.top - safeAreaInsets.bottom
    )
    // 用计算得到的safeAreaFrame加载xib布局即可
    yourCustomXibView.frame = safeAreaFrame
}

原理说明:UIScreen.main.bounds返回的是整个屏幕的原始尺寸,横屏时会包含刘海、圆角等被系统裁切的区域,而键盘的根view本身已经自动避开了这些不可用区域,所以它的bounds和safeAreaInsets完全匹配键盘的实际可用范围。

关于UIScreen.main.nativeBounds的相关说明

不建议使用nativeBounds实现该需求,它返回的是物理像素维度的屏幕原始尺寸,和当前界面方向、安全区域规则没有关联,硬要使用需要额外做多层适配,复杂度远高于上述方案:

  • 像素转逻辑点的转换方法为:物理像素值除以UIScreen.main.scale,示例代码:let pointWidth = UIScreen.main.nativeBounds.width / UIScreen.main.scale
  • 转换后得到的数值和UIScreen.main.bounds的对应边长完全一致,依然无法解决安全区域适配问题,没有使用价值。

内容的提问来源于stack exchange,提问作者teafortay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:02