iOS中如何实现除状态栏区域外全屏显示模态视图控制器?
解决iOS模态ViewController全屏且避开状态栏的问题
你完全不用手动加20px的透明框,这个需求其实有非常优雅的系统级解决方案——核心是结合模态样式设置+安全区域布局,之前没成功应该是没把这两点配合好。
具体步骤:
第一步:设置正确的模态展示样式
首先要把你的模态ViewController的modalPresentationStyle设为.fullScreen(iOS13之前默认就是这个,但iOS13+默认是pageSheet,也就是你说的圆角矩形+背景可见的样式)。这样模态VC会真正全屏覆盖前一个视图,不会留空隙。代码示例(Swift):
let yourModalVC = YourCustomModalVC() yourModalVC.modalPresentationStyle = .fullScreen present(yourModalVC, animated: true)Objective-C版本:
YourCustomModalVC *yourModalVC = [[YourCustomModalVC alloc] init]; yourModalVC.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:yourModalVC animated:YES completion:nil];第二步:让内容自动避开状态栏
接下来要确保你的模态VC的内容不会延伸到状态栏后方,这里绝对不能用固定的20px高度(因为刘海屏状态栏是44px,非刘海是20px,固定值会适配失败),而是用系统的安全区域布局:如果你用代码写Auto Layout,把内容视图的顶部约束绑定到
view.safeAreaLayoutGuide.topAnchor,而不是直接绑定到view.topAnchor:override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // 示例内容视图 let mainContent = UIView() mainContent.backgroundColor = .systemBlue mainContent.translatesAutoresizingMaskIntoConstraints = false view.addSubview(mainContent) NSLayoutConstraint.activate([ mainContent.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), mainContent.leadingAnchor.constraint(equalTo: view.leadingAnchor), mainContent.trailingAnchor.constraint(equalTo: view.trailingAnchor), mainContent.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) }如果你用Storyboard/XIB:
- 选中模态VC的根视图,在右侧属性检查器里找到「Extend Edges」,取消勾选「Under Top Bars」;
- 把你的内容视图的顶部约束拖到「Safe Area.top」,而不是「View.top」。
额外说明:
如果你想保留一些模态转场的特性(比如部分自定义动画),又要全屏覆盖,也可以用.overFullScreen作为模态样式,只要确保模态VC的背景色是不透明的,再配合安全区域布局就能达到同样效果。
这样设置后,你的模态VC就会全屏显示(看不到前一个视图),同时内容自动避开状态栏,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Balint Fodor
相关产品推荐
相关产品推荐

