iOS 11、Swift 4下特定UIViewController无法隐藏状态栏
解决特定UIViewController隐藏状态栏的问题
我来帮你搞定这个状态栏不隐藏的问题~你当前的代码有个核心错误,导致系统没法正确识别你要隐藏状态栏的需求,咱们一步步修正:
1. 先确认你的Info.plist设置是正确的
你已经设置了View controller-based status bar appearance为YES,这个是对的——开启这个设置后,系统会基于每个ViewController的设置来控制状态栏,而不是全局统一设置,这正是你需要的效果。
2. 修正ViewController的代码(核心错误在这里!)
你把prefersStatusBarHidden写成了viewDidLoad里的局部变量,这完全不对!系统要的是你重写ViewController的prefersStatusBarHidden属性,而不是在方法里定义一个局部变量。另外,当开启了控制器级别的状态栏控制后,UIApplication.shared.isStatusBarHidden的全局设置会被系统忽略,所以那部分代码没用。
改成下面的正确代码:
class YourTargetViewController: UIViewController { // 关键:重写这个类属性,系统会自动查询它来决定状态栏状态 override var prefersStatusBarHidden: Bool { return true } override func viewDidLoad() { super.viewDidLoad() // 通知系统更新状态栏外观(如果是静态返回true,其实这行可以不加,但加上更稳妥) setNeedsStatusBarAppearanceUpdate() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 进入页面时强制更新状态栏 setNeedsStatusBarAppearanceUpdate() } }
3. 如果你的ViewController在导航控制器里(额外注意)
如果这个ViewController是被UINavigationController包裹的,那导航控制器会接管状态栏的控制逻辑,这时候你需要自定义一个导航控制器,让它把状态栏的控制权转发给当前显示的子控制器:
class CustomNavController: UINavigationController { override var prefersStatusBarHidden: Bool { // 让导航控制器使用顶部子控制器的状态栏设置 return topViewController?.prefersStatusBarHidden ?? super.prefersStatusBarHidden } }
然后把你的导航控制器换成这个自定义的类,这样目标ViewController的状态栏设置才能生效。
为什么之前的代码无效?
prefersStatusBarHidden必须是ViewController的类级重写属性,系统会在需要的时候自动调用它,你放在viewDidLoad里的局部变量系统根本看不到。- 当
View controller-based status bar appearance设为YES时,全局的UIApplication.shared.isStatusBarHidden设置会被忽略,所以你那部分代码等于白写。
这样修改后,导航到这个特定ViewController时状态栏就会隐藏,回到其他控制器时会自动恢复显示啦~
内容的提问来源于stack exchange,提问作者WalterBeiter
相关产品推荐
相关产品推荐

