【问题标题】:hide status bar swift 4快速隐藏状态栏 4
【发布时间】:2018-03-14 14:01:45
【问题描述】:

我试图在我的一个 UIViewControllers (Swift 4) 中隐藏状态栏。

  • 首先,我在Info.plist 中将基于控制器的状态栏外观设置为YES

  • 我覆盖了控制器中的 prefersStatusBarHidden 属性:


override var prefersStatusBarHidden: Bool {
     return true
}

  • viewDidLoad() 中,我添加了setNeedsStatusBarAppearanceUpdate() 函数来强制读取prefersStatusBarHidden 属性。

毕竟,我仍然看到UIViewController 上的状态栏。

有人可以帮帮我吗?

【问题讨论】:

  • 也许如果你添加一些代码会有助于做出答案
  • @Anbu.Karthik 您链接的答案是 OP 已经完成的事情。
  • 我已经尝试了@Anbu.Karthik 评论中提到的所有内容
  • 你使用的是 UIPageViewController 还是其他视图层次结构?

标签: ios swift4


【解决方案1】:

您可以通过添加以下代码来隐藏任何或所有视图控制器中的状态栏:

override var prefersStatusBarHidden: Bool {
     return true
   }

任何包含该代码的视图控制器都会默认隐藏状态栏。

如果你想为状态栏设置动画,只需在视图控制器上调用 setNeedsStatusBarAppearanceUpdate() - 这将强制再次读取 prefersStatusBarHidden,此时点您可以返回不同的值。如果您愿意,您对 setNeedsStatusBarAppearanceUpdate() 的调用实际上可以在动画块内,这会导致状态栏以平滑的方式隐藏或显示。

【讨论】:

  • 我尝试了所有这些,甚至 UIApplication.shared.isStatusBarHidden = true 在 vi​​ewDidLoad() 中,但状态栏仍然存在...我阅读了 swift 4 更改日志,并且没有任何关于更改 prefersStatusBarHidden 的内容。 .
  • 我在我的 Swift 4 项目中所做的只是添加了上面的覆盖,没有别的,它起作用了。无需更改 Info.plist 文件,无需调用 setNeedsStatusBarAppearanceUpdate()
  • 为我工作。我没有碰plist。只需将上面的代码复制并粘贴到 UIViewController 子类中即可。
【解决方案2】:

您可能已经找到了自己的解决方案,但我是这样工作的:

override func viewWillAppear(_ animated: Bool) {
    // Sets the status bar to hidden when the view has finished appearing
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
    // Sets the status bar to visible when the view is about to disappear
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = false
}

【讨论】:

  • 这是一些有风险的代码...如果 Apple 出于某种原因更改了子类(我不会感到惊讶,他们在过去更改了更疯狂的东西),crash boom bang
  • 如果你改用空操作符,最坏的情况就是它会出现。如果让 statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView { statusBar.isHidden = false }
【解决方案3】:

如果您以模态方式呈现视图控制器,请尝试

viewController.modalPresentationCapturesStatusBarAppearance = true

【讨论】:

  • 不错!你救了我的命:)
【解决方案4】:

尝试将 Info.plist 中的“查看基于控制器的状态栏外观”标志设置为“是”。这将强制应用在每个视图控制器上调用 prefersStatusBarHidden: Bool 属性。

【讨论】:

    【解决方案5】:

    虽然有些实现更简洁,例如:

    UIApplication.shared.isStatusBarHidden = true

    在过渡期间有一些奇怪的剪辑动画。虽然比较冗长,但我更喜欢@MachTurtle 的解决方案:

    override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(true)
            if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView{
            statusBar.isHidden = true
            }
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.isHidden = false
    }
    

    试试看,对我很有用。

    【讨论】:

    • 这是一些有风险的代码...如果 Apple 出于某种原因更改了子类(我不会感到惊讶,他们在过去更改了更疯狂的东西),crash boom bang
    【解决方案6】:

    使用以下代码 UIApplication.shared.isStatusBarHidden = true

    这是我发现的唯一在 iOS11 中工作的东西。 你可以写在didFinishLaunchingWithOptions或你的'viewWillAppear'BaseViewController 享受吧。

    【讨论】:

      【解决方案7】:

      正如您所说,您正在使用 UINavigationController 导航到您的自定义视图控制器。我想您已将自定义视图控制器设置为 UINavigationController 的根视图。在这种情况下,在您的自定义视图控制器中覆盖 var prefersStatusBarHidden 将不起作用,但您必须继承您的 UINavigation 控制器并覆盖那里的属性,如下所示:-

      class CustomNavigationController: UINavigationController {
      
          override var prefersStatusBarHidden: Bool {
              return true
          }
      
      }
      

      【讨论】:

        【解决方案8】:

        我发现 prefersStatusBarHidden 没有在我的视图控制器中被调用,因为我使用的是自定义容器视图,我需要将状态栏隐藏职责转发给子视图控制器。如果对我来说,在容器视图控制器中实现 var childForStatusBarHidden: UIViewController? { return childViewController } 是固定的。

        【讨论】:

          【解决方案9】:

          当您尝试重载 UINavigationStack 中 ViewController 的状态栏属性时 - 您需要在下面进行扩展

          extension UINavigationController {
            override open var childForStatusBarStyle: UIViewController? {
              return self.topViewController
            }
          }
          

          然后您的重载属性将变为活动状态

          【讨论】:

            【解决方案10】:

            我正在寻找它,而我的一项工作是

            斯威夫特 5

            override var prefersStatusBarHidden: Bool {
              return true
             }
            

            【讨论】:

              【解决方案11】:

              尝试检查项目设置的常规部分下的隐藏状态栏

              【讨论】:

              • 感谢您的回答,但我不需要隐藏整个应用的状态栏,只需要一个自定义 UIViewController
              • 此设置最初只是隐藏状态栏,有助于确保在许多情况下隐藏状态栏。
              【解决方案12】:

              这些都不适合我在 iOS 11 中处理转换后的项目。这就是我所做的。我在 AppDelegate 中添加了这段代码

              func application(_ application: UIApplication,
                  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
              {
                  application.isIdleTimerDisabled = true
                  application.isStatusBarHidden = true
                  return true
              }
              

              【讨论】:

                【解决方案13】:

                只需将视图的“顶部空间”约束从安全区域更改为超级视图。它会将您的视图拖到状态栏下,因此无需隐藏它 ]1

                【讨论】:

                  【解决方案14】:

                  如果是子视图控制器需要在容器视图控制器中编写代码

                       override var prefersStatusBarHidden: Bool {
                        return true
                       }
                  

                  【讨论】:

                    【解决方案15】:

                    将此添加到您的 info.plist

                    <key>UIStatusBarHidden</key>
                        <true/>
                    

                    【讨论】:

                    • 这会隐藏整个应用程序的状态栏。问题是针对一种观点。
                    猜你喜欢
                    • 1970-01-01
                    • 2011-04-29
                    • 2012-02-28
                    • 2014-10-30
                    • 2017-03-20
                    • 2013-11-12
                    相关资源
                    最近更新 更多