获取明暗模式主题更改的更新

Posted

技术标签:

【中文标题】获取明暗模式主题更改的更新【英文标题】:Get update for light/dark mode theme change 【发布时间】:2019-11-21 15:24:07 【问题描述】:

我有一个 SwiftUI 应用程序,其中有一个 SpriteKit 场景。但是,在明暗模式之间切换时,在重新打开应用之前,场景背景不会改变颜色

这并不理想,所以我想在更改明暗模式外观时进行注册。我的资产中的颜色具有“任意”和“深色”两种外观。

UIViewRepresentable 结构中的updateUIView() 中的代码,它在与 SwiftUI 链接时设置场景:

scene.backgroundColor = UIColor(named: "Color.Scene")!
uiView.presentScene(scene)

我如何实现这一目标?我正在使用 ios 13 的系统范围的暗模式,所以我不想要通知中心的解决方案,因为我要做的就是根据系统设置更新背景。

【问题讨论】:

你能像这样在视图中使用@Environment (\.colorScheme) var colorScheme: ColorScheme,在正文中使用if self.colorScheme == .light ... else ... 吗?视图将在更改时更新。 那么如果配色方案发生变化,我如何让if 运行? 它会自动执行,因为它被视为@State。如果您编辑问题并提供更多示例代码,我会尝试给您一个示例 @krjw 感谢您的帮助!环境变量修复了它。我将它放在持有我的UIViewRepresentable 的 SwiftUI 视图中。然后,在构造函数中,我设置场景的颜色,就像我在问题中显示的那样,因为主题是自动设置的。 @krjw 我也不需要使用colorScheme 变量,但是没有这个,它就行不通了。 【参考方案1】:

您可以在您的视图中使用@Environment (\.colorScheme) var colorScheme: ColorScheme 并使视图body 对其作出反应:

struct ContentView: View 
    @Environment (\.colorScheme) var colorScheme: ColorScheme

    var body: some View 
        HStack 
            if self.colorScheme == .light  
                // draw for light mode
             else  
                // draw for dark mode
            
        
    

【讨论】:

以上是关于获取明暗模式主题更改的更新的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Material-UI AppBar 的明暗主题颜色?

Flutter:如何在 Flutter 中使用 Switch 更改主题 - 我已经使用 Provider 实现了这个明暗主题,但不能使用 switch 更改

在 iOS 13 中停止更改状态栏

Jetpack Compose:如何以编程方式将主题从浅色模式更改为深色模式 onClick

WP7:了解暗/亮图标以及如何根据它们动态更改(通过mvvmlight)?

Vuetify 明暗主题切换