我的要求是,在我的应用程序中有两个流,所以对于这两个流,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/>
你们能告诉我什么方法,这样我就可以只写两行代码,我可以达到我的要求。
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
}
}
现在您可以轻松更改,这将完美地工作:)
您可以通过创建两个视图控制器来实现此目的,如下所示:
对于 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
}
当您需要蓝色状态栏时,请扩展蓝色,当您需要红色时,请扩展红色。
创建基本视图控制器(根(并扩展它。
class BaseViewController: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarView?.backgroundColor = AppColors.themeStatusColor
}
}
用:
class MYSecondFlowController: BaseViewController {
}