Swift in iOS 中如何立即更改状态栏文本颜色 13
How to change status bar text color immediately in Swift in iOS 13
我正在使用 Swift 5.1 和 Xcode 11.1,目前我已经完成了深色模式设计。
用户使用此代码在设置页面中更改主题样式后,主题会立即更新。
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
// App Delegate File
...
func changeTheme(themeVal: String) {
if #available(iOS 13.0, *) {
switch AppState.appThemeStyle {
case "dark":
window?.overrideUserInterfaceStyle = .dark
break
case "light":
window?.overrideUserInterfaceStyle = .light
break
default:
window?.overrideUserInterfaceStyle = .unspecified
}
}
}
但问题是我看不到状态栏文本,因为状态栏文本颜色和视图颜色相同。
谁能给我一些好的解决方案?
谢谢
状态栏颜色不是全局的(默认情况下),如果您将其设置为非 ViewControllerBased
,您将无法再更改它。所以你需要像这样在你需要的任何视图中改变它:
var statusBarStyle = UIStatusBarStyle.default { didSet { setNeedsStatusBarAppearanceUpdate() } }
override var preferredStatusBarStyle: UIStatusBarStyle { statusBarStyle }
这两个变量可以帮助您更改状态栏。请注意,您可以在动画块内调用 setNeedsStatusBarAppearanceUpdate
以使其可动画化。
为了检测 UserInterfaceStyle
何时发生变化(并相应地更新状态栏颜色),所有视图和视图控制器都具有相应的委托函数。所以知道:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
updateStatusBarColor()
}
}
这是函数:
func updateStatusBarColor() {
switch traitCollection.userInterfaceStyle {
case .unspecified: statusBarStyle = .default
case .light: statusBarStyle = .darkContent
case .dark: statusBarStyle = .lightContent
}
}
注意:
ParentViewController 定义 statusBarColor
。因此,如果您使用的是通用 navigationController
或 tabBarController
,使用这些代码为他们定制的 class 应该就足够了。
我正在使用 Swift 5.1 和 Xcode 11.1,目前我已经完成了深色模式设计。
用户使用此代码在设置页面中更改主题样式后,主题会立即更新。
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
// App Delegate File
...
func changeTheme(themeVal: String) {
if #available(iOS 13.0, *) {
switch AppState.appThemeStyle {
case "dark":
window?.overrideUserInterfaceStyle = .dark
break
case "light":
window?.overrideUserInterfaceStyle = .light
break
default:
window?.overrideUserInterfaceStyle = .unspecified
}
}
}
但问题是我看不到状态栏文本,因为状态栏文本颜色和视图颜色相同。
谁能给我一些好的解决方案? 谢谢
状态栏颜色不是全局的(默认情况下),如果您将其设置为非 ViewControllerBased
,您将无法再更改它。所以你需要像这样在你需要的任何视图中改变它:
var statusBarStyle = UIStatusBarStyle.default { didSet { setNeedsStatusBarAppearanceUpdate() } }
override var preferredStatusBarStyle: UIStatusBarStyle { statusBarStyle }
这两个变量可以帮助您更改状态栏。请注意,您可以在动画块内调用 setNeedsStatusBarAppearanceUpdate
以使其可动画化。
为了检测 UserInterfaceStyle
何时发生变化(并相应地更新状态栏颜色),所有视图和视图控制器都具有相应的委托函数。所以知道:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
updateStatusBarColor()
}
}
这是函数:
func updateStatusBarColor() {
switch traitCollection.userInterfaceStyle {
case .unspecified: statusBarStyle = .default
case .light: statusBarStyle = .darkContent
case .dark: statusBarStyle = .lightContent
}
}
注意:
ParentViewController 定义 statusBarColor
。因此,如果您使用的是通用 navigationController
或 tabBarController
,使用这些代码为他们定制的 class 应该就足够了。