iOS应用中iPhone X及后续刘海屏设备导航栏出现透明黑幕问题
问题原因与解决方案
核心原因
这种情况通常是导航控制器的布局延伸规则或导航栏的半透明属性配置异常,导致视图没有正确延伸至刘海屏的顶部安全区域之外,从而出现导航栏上方的黑色区域。
解决方案
1. 恢复导航控制器的布局延伸设置
导航控制器默认会让子视图控制器的视图延伸到导航栏和状态栏下方,但如果edgesForExtendedLayout被修改为非UIRectEdgeAll的值,就会导致无法全屏。在子视图控制器的viewDidLoad中添加代码:
// Swift navigationController?.edgesForExtendedLayout = .all
// Objective-C self.navigationController.edgesForExtendedLayout = UIRectEdgeAll;
2. 调整导航栏半透明属性及配套布局
- 若需要保持导航栏半透明(默认状态),确保
translucent属性为开启状态:
// Swift navigationController?.navigationBar.isTranslucent = true
// Objective-C self.navigationController.navigationBar.translucent = YES;
- 若必须使用不透明导航栏,需额外开启
extendedLayoutIncludesOpaqueBars,让视图延伸至导航栏上方:
// Swift extendedLayoutIncludesOpaqueBars = true
// Objective-C self.extendedLayoutIncludesOpaqueBars = YES;
3. 适配滚动视图的安全区域(使用UIScrollView/TableView等时)
iOS 11及以后,滚动视图的内边距调整由contentInsetAdjustmentBehavior控制,设置为自动适配即可:
// Swift scrollView.contentInsetAdjustmentBehavior = .automatic
// Objective-C scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
4. Interface Builder可视化设置(你可能忽略的入口)
- 选中导航控制器内的子视图控制器,打开右侧Attributes Inspector(属性面板),找到Extend Edges区域,确保Under Top Bars选项处于勾选状态。
- 选中导航栏,在Attributes Inspector中确认Translucent选项已勾选(若需半透明导航栏)。
内容的提问来源于stack exchange,提问作者iOS dev
相关产品推荐
相关产品推荐

