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

如何设置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
解决方案
  1. 开启主ViewController的Trait Variations
    将主VC的Use Trait Variations设置改为ON。Trait Variations是适配异形屏的核心设置,旧项目关闭该选项会导致安全区域布局规则无法正常应用。

  2. 将View布局约束绑定到安全区域
    主VC当前使用Autoresizing Mask布局,建议切换为Auto Layout,并将View的边缘约束直接绑定到安全区域:

    • 选中主VC的View,把Layout从Autoresizing Mask改为Auto Layout;
    • 添加4条约束:顶部对齐安全区域顶部、底部对齐安全区域底部、左侧对齐安全区域左侧、右侧对齐安全区域右侧。
  3. 检查启动屏布局一致性
    启动屏已开启Safe Area,确保启动屏内的内容同样约束到安全区域,避免启动画面与主界面显示区域出现视觉错位。

  4. 代码层面兜底修复
    如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:34:52