我正在开发一个 swift 应用程序,我想UIStatusBarStyle根据应用程序的主题进行更改(有 2 个选项 - 浅色和深色主题)。我已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
}
Run Code Online (Sandbox Code Playgroud)
真的没有结果。我试图通过仅返回来测试它:return .lightContent但这也没有改变状态栏。
我究竟做错了什么?
更新:
好的,这就是我正在尝试做的,但它不起作用。
fileprivate func applyTheme() {
statusBarStyle = UserDefaults.standard.bool(forKey: SelectedThemeKey) ? .default : .lightContent
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return statusBarStyle
}
Run Code Online (Sandbox Code Playgroud)
它不起作用。尽管更改了主题,但状态栏始终保持默认样式。applyTheme()被调用viewDidLoad()并且viewWillAppear()
您需要在任何更改后调用此方法
setNeedsStatusBarAppearanceUpdate()
Run Code Online (Sandbox Code Playgroud)
//
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
}
}
Run Code Online (Sandbox Code Playgroud)