UIStatusBarStyle 没有改变
UIStatusBarStyle doesn't change
我正在开发 swift 应用程序,我想根据应用程序的主题更改 UIStatusBarStyle
(有 2 个选项 - 浅色和深色主题)。我在 info.plist
中将 View controller-based status bar appearance
设置为 NO
,在 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()
中调用
您需要在任何更改后调用此方法
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
}
}
首先,你的代码毫无意义。你说
I have set View controller-based status bar appearance to NO in the info.plist and in the UIViewController I tried to set it
所以一方面你告诉运行时,不要听我的视图控制器。然后当运行时不听你的视图控制器时你抱怨!
其次,请记住,您的视图控制器在状态栏外观中没有发言权,除非它是顶级视图控制器(或顶级视图控制器故意遵从它)。例如,如果您的视图控制器位于导航控制器内,则它的 statusBarStyle
完全无关紧要。
第一个
如果您尝试将 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
的 preferredStatusBarStyle
来处理它。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
但还是不行,为什么?
在你的情况下,我猜 UIViewController
是 UINavigationController
的 viewControllers
之一。
如果您使用了 UINavigationController
,您应该覆盖 UINavigationController
中的 preferredStatusBarStyle
。
也许你会说我需要为不同的视图控制器设置不同的状态栏样式,没关系。
只需像这样覆盖 UINavigationController
中的 childForStatusBarStyle
override var childForStatusBarStyle: UIViewController? {
return topViewController
}
然后覆盖 UIViewController
您想要更改的 preferredStatusBarStyle
。
你也可以像这样extension
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return topViewController
}
}
我正在开发 swift 应用程序,我想根据应用程序的主题更改 UIStatusBarStyle
(有 2 个选项 - 浅色和深色主题)。我在 info.plist
中将 View controller-based status bar appearance
设置为 NO
,在 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()
您需要在任何更改后调用此方法
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
}
}
首先,你的代码毫无意义。你说
I have set View controller-based status bar appearance to NO in the info.plist and in the UIViewController I tried to set it
所以一方面你告诉运行时,不要听我的视图控制器。然后当运行时不听你的视图控制器时你抱怨!
其次,请记住,您的视图控制器在状态栏外观中没有发言权,除非它是顶级视图控制器(或顶级视图控制器故意遵从它)。例如,如果您的视图控制器位于导航控制器内,则它的 statusBarStyle
完全无关紧要。
第一个
如果您尝试将 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
的 preferredStatusBarStyle
来处理它。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
但还是不行,为什么?
在你的情况下,我猜 UIViewController
是 UINavigationController
的 viewControllers
之一。
如果您使用了 UINavigationController
,您应该覆盖 UINavigationController
中的 preferredStatusBarStyle
。
也许你会说我需要为不同的视图控制器设置不同的状态栏样式,没关系。
只需像这样覆盖 UINavigationController
中的 childForStatusBarStyle
override var childForStatusBarStyle: UIViewController? {
return topViewController
}
然后覆盖 UIViewController
您想要更改的 preferredStatusBarStyle
。
你也可以像这样extension
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return topViewController
}
}