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

What should be the best way to change StatusBar background colour and preferredStatusBarStyle?

我的要求是,在我的应用程序中有两个流程,因此对于两个流程,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/>

你们能告诉我任何方法吗,这样我就可以只在两个地方写这些代码行,就可以实现我的要求。

创建基础视图控制器(root)并扩展它。

class BaseViewController: UIViewController {

   override var preferredStatusBarStyle: UIStatusBarStyle {
      return .lightContent
   }

   override func viewDidLoad() {
      super.viewDidLoad()

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

使用:

class MYSecondFlowController: BaseViewController {

}

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

// For 20 VC 蓝色状态栏

class BaseVCBlue: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

 override func viewDidLoad() {
        super.viewDidLoad()

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

// For 20 VC 红色状态栏

class BaseVCRed: UIViewController {

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

 override func viewDidLoad() {
        super.viewDidLoad()

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

当你需要蓝色状态栏扩展蓝色,当你想要红色扩展红色。

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
    }
}

现在你可以轻松更改,这将完美地工作:)