更改StatusBar背景颜色和preferredStatusBarStyle的最佳方法是什么?

时间:2018-10-11 05:34:11

标签: ios swift ios-statusbar

我的需求就像,在我的应用程序中有两个流,因此对于这两个流,PreferredStatusBarStyle和StatusBar背景色的值都不同。因此,如果我有40个viewControllers,则20个VC的值相同,而20个VC的值与前20个值不同。

目前,我正在更改每个视图控制器中的值,如下所示:-

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

override func viewDidLoad() {
    super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
}

在info.plist中,我做到了:-

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

你们能以任何方式告诉我,所以我可以仅在两个地方写这些代码行,就可以达到我的要求。

3 个答案:

答案 0 :(得分:1)

创建基本视图控制器(根)并对其进行扩展。

[
   {
      "Name":"Bell",
      "Class":"BWB0",
      "Lv":31,
      "Kill":0,
      "Serial":3,
      "PvpPoint":0,
      "Death":0
   },
   {
      "Name":"Perkss",
      "Class":"AWB0",
      "Lv":17,
      "Kill":0,
      "Serial":6,
      "PvpPoint":2400,
      "Death":0
   },
   {
      "Name":"1233",
      "Class":"BWB0",
      "Lv":3,
      "Kill":0,
      "Serial":1,
      "PvpPoint":0,
      "Death":0
   },
   {
      "Name":"Cora",
      "Class":"CWB0",
      "Lv":1,
      "Kill":0,
      "Serial":4,
      "PvpPoint":0,
      "Death":0
   }
]

使用:

class BaseViewController: UIViewController {

   override var preferredStatusBarStyle: UIStatusBarStyle {
      return .lightContent
   }

   override func viewDidLoad() {
      super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
   }
}

答案 1 :(得分:1)

您可以通过创建两个如下所示的ViewController来实现此目的:

//对于带有蓝色状态栏的20 VC

class BaseVCBlue: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

 override func viewDidLoad() {
        super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = UIColor.blue
    }

//对于带有红色状态栏的20 VC

class BaseVCRed: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

 override func viewDidLoad() {
        super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

当您需要蓝色状态栏时,将其扩展为蓝色,当您希望红色状态时,将其扩展为红色。

答案 2 :(得分:1)

class BaseVCBlue: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.default
}

override func viewDidLoad() {
    super.viewDidLoad()

    self.setNeedsStatusBarAppearanceUpdate()
    UIApplication.shared.statusBarView?.backgroundColor = UIColor.white
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.setNeedsStatusBarAppearanceUpdate()
}
}



class BaseVc: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

override func viewDidLoad() {
    super.viewDidLoad()

    UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.setNeedsStatusBarAppearanceUpdate()
}

但最重要的一个是: 在一种情况下,这是行不通的,即您的控制器已嵌入导航堆栈中。原因是iOS希望父级控制器(而不是子级控制器)决定一个人需要显示哪种状态栏,然后再执行以下操作:-

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? .default
    }
}

现在,您可以轻松更改,并且可以完美运行:)