刘海屏iPhone重写prefersStatusBarHidden无法隐藏状态栏问题
全面屏刘海iPhone 无法隐藏状态栏问题解答
从iPhone X开始的所有带刘海/灵动岛的全面屏iPhone,均支持第三方App隐藏状态栏,重写prefersStatusBarHidden返回true仍不生效,是UIKit状态栏控制逻辑的配置问题,按以下优先级排查:
- 容器控制器控制权问题
如果当前ViewController嵌套在UINavigationController、UITabBarController等容器控制器中,系统默认优先读取容器本身的prefersStatusBarHidden属性,不会直接响应子VC的重写逻辑。
解决方式:重写容器控制器的childForStatusBarHidden属性,将状态栏控制权返回给当前展示的子VC,以UINavigationController为例:
override var childForStatusBarHidden: UIViewController? { return topViewController }
如果是模态present弹出的页面,需要在当前VC的viewDidLoad中添加如下代码,声明由当前VC接管状态栏样式:
modalPresentationCapturesStatusBarAppearance = true
Info.plist 配置校验
找到配置项View controller-based status bar appearance(对应键值UIViewControllerBasedStatusBarAppearance),确保值设置为YES。如果该值为NO,系统会完全忽略VC级别的状态栏配置,仅读取UIApplication的全局状态栏设置(该全局API在iOS 13之后已被废弃,不建议使用)。主动触发状态栏刷新
完成上述配置后,如果状态栏没有自动更新,可以在需要切换状态栏显隐的位置调用如下方法,强制系统刷新状态栏状态:
setNeedsStatusBarAppearanceUpdate()
补充说明:iOS仅在主屏幕、锁屏等系统级场景强制显示状态栏,第三方App内只要配置正确,可随时根据业务场景隐藏状态栏,视频App全屏播放时的隐栏效果就是标准实现案例。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

