我正在使用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
}
}
}
但是问题是我看不到状态栏文本,因为状态栏文本颜色和视图颜色相同。
有人可以建议我一个好的解决方案吗? 谢谢。
答案 0 :(得分:2)
状态栏颜色不是全局的(默认情况下),如果将其设置为非ViewControllerBased
,则无法再更改它。因此,您需要像这样在任何视图中更改设置它:
var statusBarStyle = UIStatusBarStyle.default { didSet { setNeedsStatusBarAppearanceUpdate() } }
override var preferredStatusBarStyle: UIStatusBarStyle { statusBarStyle }
这两个变量可帮助您更改状态栏。请注意,您可以在动画块内调用setNeedsStatusBarAppearanceUpdate
使其具有动画效果。
要检测UserInterfaceStyle
何时更改(并相应地更新statusBar颜色),所有视图和viewController都具有委托功能。因此知道:
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
,那么使用这些代码为其自定义类就足够了。