Xcode 11 -- SwiftUI 的深色模式设置

Xcode 11 -- SwiftUI's dark mode setup

好的。我知道这不应该是火箭科学。我似乎无法使用暗模式,我已经阅读了几次文档。希望有人能找出我遗漏的东西。

我在资产目录中有一个命名颜色。

我将我的 plist 模式设置为暗模式以便于测试。

我的内容视图如下所示:

struct ContentView : View {
var body: some View {
    VStack {
        Text("Hello World")
        Text("Yo yo yo")
            .color(Color("darkModeColor"))
    }

}

}

无论我做什么,颜色总是 "Any" 应该呈现青色的外观。

我知道深色模式本身可以工作,因为苹果提供的所有系统语义颜色都工作得很好,你可以看到 "Hello World" 文本变成了白色。

有什么想法我遗漏了什么,或者其他人 运行 对 Xcode 11 Beta 1 的这个问题有什么想法吗?

您可以在预览中更改配色方案

struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView().environment(\.colorScheme, .dark)
    }
}

upd: 你可以为明暗模式创建任何预览

struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        Group {
            ContentView()
            ContentView().environment(\.colorScheme, .dark)
        }
    }
}

这可能是 Xcode 11 测试版中的一个错误。我尝试了 UIKit 应用程序中的深色模式功能,使用 UIColor 它工作得很好,但相同的颜色不会在 SwiftUI 中使用 Color 工作。希望这将在下一个版本中得到修复。


更新:此问题已通过 Xcode 11 beta 3 修复。

我们可以用来克服此当前限制的有效(但相当冗长)解决方案是使用使用当前配色方案参数化的方法扩展 Color,如下所示:

import SwiftUI

extension Color {

    static let lightBackgroundColor = Color(white: 1.0)

    static let darkBackgroundColor = Color(white: 0.0)

    static func backgroundColor(for colorScheme: ColorScheme) -> Color {
        if colorScheme == .dark {
            return darkBackgroundColor
        } else {
            return lightBackgroundColor
        }
    }
}

并且在您需要访问这些颜色的视图中,您将为配色方案添加环境 属性 并使用它来检索动态颜色:

import SwiftUI

struct ColoredView : View {

    @Environment(\.colorScheme) var colorScheme: ColorScheme

    var body: some View {
        Rectangle().fill(Color.backgroundColor(for: self.colorScheme))
    }
}

代码中定义的这些颜色适用于 Xcode 预览和模拟器。