【问题标题】:Cannot hide status bar in a specific view controller in iOS 11, Swift 4无法在 iOS 11、Swift 4 的特定视图控制器中隐藏状态栏
【发布时间】:2018-03-16 10:47:14
【问题描述】:

我有一个通用的 UIViewController,我想在其中隐藏状态栏。我有更多应该显示状态栏的视图控制器,但是这个特定的视图控制器应该隐藏状态栏。

我在 UIViewController 类中实现了以下方法:

override func viewDidLoad() {
    super.viewDidLoad()
    // FIXME: hide status bar
    var prefersStatusBarHidden: Bool {
        return true
    }
    setNeedsStatusBarAppearanceUpdate()
}

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = false
}

在我的 info.plist 中,我设置了以下设置:

当我导航到该视图控制器时状态栏不会隐藏并且仍然可见。

【问题讨论】:

  • viewDidLoad之外调用这个方法

标签: ios swift statusbar uistatusbar


【解决方案1】:

在您的视图控制器中覆盖 prefersStatusBarHidden

override var prefersStatusBarHidden: Bool {
    return true
}

View Controller based status bar appearance 设置一个值No,然后显示/隐藏特定视图控制器的状态栏。

结果如下:

【讨论】:

  • 我必须实现@pkc456 提到的方法。然后将此设置设置为“否”。它现在正在工作。谢谢。
  • viewDidLoad 方法中使用prefersStatusBarHidden 对我不起作用。其他方法对我有用。
  • 我没有在 viewdidLoad 中处理任何东西,这是 UIViewController 的默认方法,你需要重写它并返回一个布尔值。这个答案有结果。
【解决方案2】:

在要隐藏状态栏的视图控制器中,

viewWillAppear方法中,UIApplication.shared.isStatusBarHidden = true

viewWillDisAppear 方法中,UIApplication.shared.isStatusBarHidden = false

【讨论】:

  • 编辑:我将 info.plist 设置更改为“NO”并实现了你的方法,状态栏现在消失了,但在所有其他视图控制器中它是黑色的——它之前是白色的,然后喊 be白色的。 edit2:我在常规选项卡中将状态栏样式编辑为“轻”,现在它可以工作了。
  • @WalterBeiter 更改状态栏颜色:- UIApplication.shared.statusBarStyle = .lightContent
  • isStatusBarHidden 在 iOS 9 中已弃用
【解决方案3】:

要关闭某些视图控制器的状态栏,但不是全部,如果存在此 info.plist 条目,请删除它或将其设置为 YES:

View controller-based status bar appearance = YES

然后将这一行添加到每个需要隐藏状态栏的视图控制器

override var prefersStatusBarHidden: Bool { return true } 

要关闭整个应用程序的状态栏,请将其添加到 info.plist:

View controller-based status bar appearance = NO

这将使“隐藏状态栏”按预期工作。检查位于部署信息下项目常规设置中的隐藏状态栏。

【讨论】:

    【解决方案4】:
    UIApplication.shared.isStatusBarHidden = true
    

    isStatusBarHidden”的此 Setter 上方在 iOS 9.0 中已弃用

    所以使用下面的代码它工作正常:)

    override var prefersStatusBarHidden: Bool {
            return true
        }
    

    【讨论】:

      【解决方案5】:

      应用代理 迅捷4.2

      NotificationCenter.default.addObserver(self, selector: #selector(videoExitFullScreen), name:NSNotification.Name(rawValue: "UIWindowDidBecomeHiddenNotification") , object: nil)
      
      @objc func videoExitFullScreen() {
              UIApplication.shared.setStatusBarHidden(false, with: .none)
      
          }
      

      【讨论】:

        【解决方案6】:

        在 Swift 5 中

        override var preferredStatusBarStyle: UIStatusBarStyle {
            return .default
        }
        

        【讨论】:

          【解决方案7】:

          在 ViewController 中添加以下行

          extension UIViewController {
              func prefersStatusBarHidden() -> Bool {
                  return true
              }
          }
          

          【讨论】: