【问题标题】:Show and Hide StatusBar from a global function?从全局函数中显示和隐藏状态栏?
【发布时间】:2015-04-23 13:45:04
【问题描述】:

我想创建一个可以用来显示和隐藏状态栏的全局函数。这是我所做的:

class Helper {
      class func hide() {
        let app = UIApplication.sharedApplication()
        if !app.statusBarHidden {
          app.statusBarHidden = true
        }
      }
      class func show() {
        let app = UIApplication.sharedApplication()
        if app.statusBarHidden {
          app.statusBarHidden = false
        }
      }
}

它是这样称呼的:

Helper.hide()

我把这些函数放在一个辅助类中。调用 hide() 函数不会隐藏状态栏。

我也在info.plist中设置了状态栏最初是隐藏的

如何在全局函数中显示和隐藏 StatusBar?

【问题讨论】:

  • 您是否在相关视图中导入您的助手类?还是你的类继承自你的辅助函数
  • @JSA986 我只是从任何地方打电话给Helper.hide()

标签: ios objective-c swift


【解决方案1】:

UIViewController 上创建一个名为isStatusBarHidden 的静态布尔属性。

extension UIViewController {
    static var isStatusBarHidden = false
}

在所需的视图控制器中,您只需要覆盖 prefersStatusBarHidden 属性

class ViewController: UIViewController {
    // ..
    override var prefersStatusBarHidden: Bool {
        return UIViewController.isStatusBarHidden
    }
    // ..
}

那么您需要做的就是根据需要将您的 var 设置为 true 或 false:

UIViewController.isStatusBarHidden = true

打开/关闭覆盖该属性的视图控制器的状态栏:

UIViewController.isStatusBarHidden = !UIApplication.shared.isStatusBarHidden

别忘了调用 setNeedsStatusBarAppearanceUpdate

setNeedsStatusBarAppearanceUpdate()

【讨论】:

    【解决方案2】:

    appDelegate 中的 setStatusBarStyle 不会转发到视图控制器。他们控制自己的状态。所以试试这个:

    创建一个从 UIViewController 派生的 baseViewController 类,该类实现隐藏和显示功能。然后从 baseViewController 类派生您正在使用的视图控制器。

    class baseViewController : UIViewController {
    
        var statusBarHidden : Bool = true
    
        func show()
        {
            self.statusBarHidden = false
            setNeedsStatusBarAppearanceUpdate()
        }
    
        func hide()
        {
            self.statusBarHidden = true
            setNeedsStatusBarAppearanceUpdate()
        }
    
        override func prefersStatusBarHidden() -> Bool {
            return self.statusBarHidden
        }
    }
    
    class derivedViewController: baseViewController {
        override func viewDidLoad() {
            hide() // run this to hide the status bar
            show() // run this to show the status bar
        }
    }
    

    【讨论】:

      【解决方案3】:

      在您的隐藏函数中,app 变量是未知的。当我运行您的示例时,我必须更改为:

      func hide() {
          let app = UIApplication.sharedApplication()
          if !app.statusBarHidden {
              app.statusBarHidden = true
          }
      }
      func show() {
          let app = UIApplication.sharedApplication()
          if app.statusBarHidden {
              app.statusBarHidden = false
          }
      }
      

      如果这不适用于全局函数,您可以尝试将其添加到您的 ViewControllers:

          override func prefersStatusBarHidden() -> Bool {
          return true
      }
      

      另请注意,在您的 info.plist 文件中,有一个名为“状态栏最初隐藏”的设置。将其设置为“是”,您将不会在启动时拥有它。然后你不需要在你的代码中做任何事情,当你的应用程序启动时,这个栏就会出现。参见之前的讨论:

      How to set status bar hidden for entire app in iOS?

      【讨论】:

      • 这不是用户想要做的。他希望显示和隐藏状态栏的选项,而不是在整个应用程序中隐藏
      • 刚刚在 [older page:] (stackoverflow.com/questions/19022210/… UINavigationController 不会将 preferredStatusBarStyle 调用转发到其子视图控制器。相反,它管理自己的状态 - 正如它应该的那样,它正在绘制状态栏所在的屏幕顶部,因此应该对其负责。因此,在导航控制器中的 VC 中实现 preferredStatusBarStyle 将无济于事 - 它们永远不会被调用。
      • 经过大量搜索后,我得出结论,以这种方式使用辅助类可能行不通。尝试我提出的替代方案。这对我来说效果很好,可能只需要更改您的解决方案。
      • 苹果从 Xcode 7、iOS9 中删除了 UIStatusBarHidden~ipad,这个解决方案是唯一一个在全球范围内有效的解决方案。 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2016-03-29
      相关资源
      最近更新 更多