首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设备暗模式下的状态栏问题

设备暗模式下的状态栏问题
EN

Stack Overflow用户
提问于 2022-04-16 20:14:43
回答 1查看 97关注 0票数 0

我正在添加一个选项,为用户添加一个选项来选择系统/光/暗模式。

我将用户选择存储在用户默认值中。下面是我在AppDelegate和自定义UINavigationController类中的代码。

我还尝试使用与customer UITabBarController相同的代码添加customer UINavigationController。添加了代码。

问题是当设备处于黑暗模式时,用户已经选择了光模式,那么状态栏是不可见的。同样,如果设备处于光模式,但用户选择了暗模式,则状态栏不是白色的。

附加信息

场景-黑暗模式下的设备和应用程序风格的灯光应用程序打开状态栏不可见。如果我切换设备userInterfaceStyle到光明,那么状态栏文本变成黑色和可见的,状态栏成为光和可见的当我点击另一个选项卡按钮去不同的视图控制器。当应用程序打开时,问题只出现在第一个视图控制器上。添加了日志语句的输出.

尝试了一些帖子中显示的解决方案,但没能找到解决方案。

AppDelegate

代码语言:javascript
运行
复制
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控制器实例化之前,我不能将其设置为另一个值。

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2022-04-22 13:55:42

试试这个,这就是我在应用程序中用来更改状态栏文本颜色的方法:

AppDelegate:

代码语言:javascript
运行
复制
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只是一个占位符变量。如果这对你有用,请告诉我:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71897199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档