更改 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
}
}
现在你可以轻松更改,这将完美地工作:)
我的要求是,在我的应用程序中有两个流程,因此对于两个流程,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
}
}
现在你可以轻松更改,这将完美地工作:)