如何设置UIViewController避免内容延伸至刘海与底部滑动栏区域
问题描述
我正在重新启用2015年开发的一款App,它仍可全屏运行,但在iPhone X及其后续机型上,内容会延伸至刘海(药丸区)和底部滑动栏区域。以下是iOS模拟器中iPhone 14 Pro Max上的显示效果:
该App在iPhone 8及所有iPad上显示正常,仅在新款iPhone上出现问题,我希望UIViewController的frame能自动限制在屏幕的安全区域内,即刘海/药丸区与底部滑动栏之间的区域。
启动屏ViewController Scene 属性
- Interface Builder Document
- Builds for: Deployment Target (12.0)
- Use Trait Variations: ON
- Use Safe Area Layout Guides: ON
- Use as Launch Screen: ON
- View
- Arrange: Position View
- Layout: Autoresizing Mask
- Layout Margins: Default
- Preserve Superview Margins: OFF
- Follow Readable width: OFF
- Safe Area Relative Margins: OFF
- Layout Guides
- Safe Area: ON
- Keyboard: OFF
主ViewController Scene 属性
- Interface Builder Document
- Builds for: Deployment Target (12.0)
- Use Trait Variations: OFF
- Use Safe Area Layout Guides: ON
- Use as Launch Screen: OFF
- View Controller
- Layout
- Adjust Scroll View Inserts: ON
- Hide Bottom Bar on Push: OFF
- Resize View from NIB: ON
- Use Full Screen (Deprecated): OFF
- Extend Edges
- Under Top Bars: OFF
- Under Bottom Bars: OFF
- Under Opaque Bars: OFF
- Layout
解决方案
开启主ViewController的Trait Variations
将主VC的Use Trait Variations设置改为ON。Trait Variations是适配异形屏的核心设置,旧项目关闭该选项会导致安全区域布局规则无法正常应用。将View布局约束绑定到安全区域
主VC当前使用Autoresizing Mask布局,建议切换为Auto Layout,并将View的边缘约束直接绑定到安全区域:- 选中主VC的View,把
Layout从Autoresizing Mask改为Auto Layout; - 添加4条约束:顶部对齐安全区域顶部、底部对齐安全区域底部、左侧对齐安全区域左侧、右侧对齐安全区域右侧。
- 选中主VC的View,把
检查启动屏布局一致性
启动屏已开启Safe Area,确保启动屏内的内容同样约束到安全区域,避免启动画面与主界面显示区域出现视觉错位。代码层面兜底修复
如果Interface Builder设置不生效,可在主ViewController的viewWillLayoutSubviews方法中手动修正frame:override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() view.frame = view.safeAreaLayoutGuide.layoutFrame }Objective-C版本:
- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; self.view.frame = self.view.safeAreaLayoutGuide.layoutFrame; }
内容的提问来源于stack exchange,提问作者Todd Lehman
相关产品推荐
相关产品推荐

