我正在添加一个选项,为用户添加一个选项来选择系统/光/暗模式。
我将用户选择存储在用户默认值中。下面是我在AppDelegate和自定义UINavigationController类中的代码。
我还尝试使用与customer UITabBarController相同的代码添加customer UINavigationController。添加了代码。
问题是当设备处于黑暗模式时,用户已经选择了光模式,那么状态栏是不可见的。同样,如果设备处于光模式,但用户选择了暗模式,则状态栏不是白色的。
附加信息
场景-黑暗模式下的设备和应用程序风格的灯光应用程序打开状态栏不可见。如果我切换设备userInterfaceStyle到光明,那么状态栏文本变成黑色和可见的,状态栏成为光和可见的当我点击另一个选项卡按钮去不同的视图控制器。当应用程序打开时,问题只出现在第一个视图控制器上。添加了日志语句的输出.
尝试了一些帖子中显示的解决方案,但没能找到解决方案。

AppDelegate
if let currentUserSelectedInterfaceStyle = userDefaults.string(forKey: "currentUserInterfaceStyle") {
switch currentUserSelectedInterfaceStyle {
case "light" :
window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.light
case "dark" :
window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.dark
case "system":
window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.unspecified
default:
window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.unspecified
}
}
else {
userDefaults.set("light", forKey: "currentUserInterfaceStyle")
userDefaults.synchronize()
window?.overrideUserInterfaceStyle = .light
}自定义导航控制器类
将statusBarStyle设置为UIStatusBarStyle.default是一个问题吗?但在nav控制器实例化之前,我不能将其设置为另一个值。
class DarkModeAwareNavigationController: UINavigationController {
var statusBarStyle = UIStatusBarStyle.default { didSet
{
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
statusBarStyle
}
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
updateStatusBarColor()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
updateStatusBarColor()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
updateStatusBarColor()
}
}
}
func updateStatusBarColor() {
let deviceStyle = UIScreen.main.traitCollection.userInterfaceStyle == .light ? "light" : "dark"
let appStyle = traitCollection.userInterfaceStyle == .light ? "light" : "dark"
switch UIScreen.main.traitCollection.userInterfaceStyle
{
case .unspecified:
statusBarStyle = .lightContent
case .light:
statusBarStyle = .darkContent
logger.info("DarkNavVC device is \(deviceStyle) and app is \(appStyle)")
case .dark:
statusBarStyle = .lightContent
logger.info("DarkNavVC device is \(deviceStyle) and app is \(appStyle)")
default:
statusBarStyle = .lightContent
}
logger.info("DarkNavVC setting statusBarStyle to \(statusBarStyle)")
}
}
class DarkModeAwareTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
}
let userDefaults = UserDefaults.standard
var statusBarStyle = UIStatusBarStyle.default { didSet
{
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
statusBarStyle
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
updateStatusBarColor()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
updateStatusBarColor()
}
}
func updateStatusBarColor() {
let currentUserSelectedInterfaceStyle = userDefaults.string(forKey: "currentUserInterfaceStyle")
let appStyle = traitCollection.userInterfaceStyle == .light ? "light" : "dark"
switch traitCollection.userInterfaceStyle
{
case .unspecified:
statusBarStyle = .lightContent
case .light:
statusBarStyle = .darkContent
logger.info("DarkTabVC device is \(deviceStyle) and app is \(appStyle)")
case .dark:
statusBarStyle = .lightContent
logger.info("DarkTabVC device is \(deviceStyle) and app is \(appStyle)")
default:
statusBarStyle = .lightContent
}
logger.info("DarkTabVC setting statusBarStyle to \(statusBarStyle)")
}
}
[AppDelegate.swift:129] application(_:didFinishLaunchingWithOptions:) > dark mode detected
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareTabBarController.swift:129] updateStatusBarColor() > DarkTabVC device is dark and app is dark
[DarkModeAwareTabBarController.swift:134] updateStatusBarColor() > DarkTabVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareNavigationController.swift:140] updateStatusBarColor() > DarkNavVC device is dark and app is dark
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareTabBarController.swift:129] updateStatusBarColor() > DarkTabVC device is dark and app is dark
[DarkModeAwareTabBarController.swift:134] updateStatusBarColor() > DarkTabVC setting statusBarStyle to UIStatusBarStyle(rawValue: 1)
[DarkModeAwareTabBarController.swift:126] updateStatusBarColor() > DarkTabVC device is dark and app is light
[DarkModeAwareTabBarController.swift:134] updateStatusBarColor() > DarkTabVC setting statusBarStyle to UIStatusBarStyle(rawValue: 3)
[DarkModeAwareNavigationController.swift:137] updateStatusBarColor() > DarkNavVC device is dark and app is light
[DarkModeAwareNavigationController.swift:145] updateStatusBarColor() > DarkNavVC setting statusBarStyle to UIStatusBarStyle(rawValue: 3)发布于 2022-04-22 13:55:42
试试这个,这就是我在应用程序中用来更改状态栏文本颜色的方法:
AppDelegate:
extension UIApplication {
func switchHostingController() -> Void {
if (appThemeType == "dark") {
windows.first?.rootViewController = DarkHostingController(rootView: ContentView())
} else {
windows.first?.rootViewController = LightHostingController(rootView: ContentView())
}
}
}
class DarkHostingController<ContentView>: UIHostingController<ContentView> where ContentView : View {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
class LightHostingController<ContentView>: UIHostingController<ContentView> where ContentView : View {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .darkContent
}
}请记住,appThemeType只是一个占位符变量。如果这对你有用,请告诉我:)
https://stackoverflow.com/questions/71897199
复制相似问题