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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:10:19