我正在开发一个快速的应用程序,我想根据该应用程序的主题(有2个选项-浅色和深色主题)更改UIStatusBarStyle
。我在View controller-based status bar appearance
中将NO
设置为info.plist
,在UIViewController
中,我尝试根据当前主题进行设置,如下所示:
override var preferredStatusBarStyle: UIStatusBarStyle {
return Theme.current.statusBarStyle
}
protocol ThemeProtocol {
// Status Bar
var statusBarStyle: UIStatusBarStyle { get }
}
class Theme {
static var current: ThemeProtocol = LightTheme()
}
class LightTheme: ThemeProtocol {
// Status Bar
var statusBarStyle: UIStatusBarStyle = .default
}
class DarkTheme: ThemeProtocol {
// Status Bar
var statusBarStyle: UIStatusBarStyle = .lightContent
}
真的没有结果。我尝试通过仅返回以下内容来测试它:return .lightContent
,但这也没有改变状态栏。
我在做什么错?
更新:
好的,这就是我正在尝试做的,但是它不起作用。
fileprivate func applyTheme() {
statusBarStyle = UserDefaults.standard.bool(forKey: SelectedThemeKey) ? .default : .lightContent
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return statusBarStyle
}
它不起作用。尽管更改了主题,状态栏始终保留默认样式。 applyTheme()
在viewDidLoad()
和viewWillAppear()
答案 0 :(得分:2)
您需要在进行任何更改后调用此方法
setNeedsStatusBarAppearanceUpdate()
//
class ViewController: UIViewController {
var current = UIStatusBarStyle.default
@IBAction func changeClicked(_ sender: Any) {
current = current == .default ? .lightContent : .default
self.setNeedsStatusBarAppearanceUpdate()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return current
}
}
答案 1 :(得分:2)
首先,您的代码没有意义。你说
我已在info.plist和我尝试设置的UIViewController中将基于View控制器的状态栏外观设置为NO。
因此,一方面,您告诉运行时,请不监听我的视图控制器。然后,当运行库不监听您的视图控制器时,您就会抱怨!
第二,请记住,除非它是顶级视图控制器(或顶级视图控制器有意遵从它),否则视图控制器在状态栏外观中没有发言权。例如,如果您的视图控制器位于导航控制器内部,则其this._auth.userState$
.mergeMap(user => this._userMetaData.getData(user.uid))
.subscribe(data => {
console.log(data);
});
完全不相关。
答案 2 :(得分:0)
第一
如果您尝试将StatusBarStyle
更改为UIApplication.shared.statusBarStyle = .default
,则应设置
View controller-based status bar appearance
成为NO
。
以这种方式,您需要在任何地方自己控制UIApplication.shared.statusBarStyle
;例如viewWillAppear
/ viewWillDisappear
。
但是在iOS 9之后不推荐使用此方法。
现在,我建议您学习新方法:
请设置View controller-based status bar appearance
为YES
,并且
覆盖UIViewController
的{{1}}来处理它。
preferredStatusBarStyle
但是它仍然不起作用,为什么?
在您的情况下,我认为override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
是UIViewController
的{{1}}中的一个。
如果您使用viewControllers
,则应覆盖UINavigationController
中的UINavigationController
。
也许您会说我需要使用差异视图控制器设置不同的状态栏样式,没关系。
像这样在preferredStatusBarStyle
中覆盖UINavigationController
childForStatusBarStyle
然后在您要更改的UINavigationController
中覆盖override var childForStatusBarStyle: UIViewController? {
return topViewController
}
。
您也可以像这样通过preferredStatusBarStyle
做到
UIViewController