UIInputViewController自定义键盘如何通过UIScreen.main.bounds计算安全区域
自定义键盘安全区域尺寸计算方案
正确获取安全区域边界的方法
开发自定义键盘时不要依赖UIScreen.main的尺寸属性计算布局,UIInputViewController的根view会自动适配当前设备的横竖屏、安全区域规则,直接基于该view的属性计算即可:
- 建议在
viewDidLayoutSubviews生命周期中执行计算,此时布局参数已经更新,取值准确 - 基于根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
相关产品推荐
相关产品推荐

