TLDR:
只需将.background(Color(UIColor.systemBackground)) 和.environment(\.colorScheme, .dark) 修饰符添加到预览中。如需解释、示例、一些修改和一些技巧,使其更漂亮甚至更简单,请阅读整个答案。
说明
我知道这个问题已经相当老了,但我找到了一种实施起来不会太痛苦并且不需要在 NavigationView 中进行任何包装的方法。此外,它还保留了.previewLayout(.sizeThatFits) 的正确行为。
本质上,当您定义符合PreviewProvider 的结构时,您只是在定义内容,但预览的背景由 Xcode 为您管理。因此,应用.environment(\.colorScheme, .dark) 只会将实际视图更改为暗模式,而不是背景。 NavigationView 解决这个问题的原因很简单——它为视图添加了一个背景,覆盖了预览的所有白色背景。
修复本身也相当简单 - 您需要做的就是在预览中为您的视图添加背景。所以对于像这样的简单视图:
struct ExampleView: View {
var body: some View {
Text("Hello, World!")
}
}
还有一组这样的预览:
struct ExampleView_Previews: PreviewProvider {
static var previews: some View {
Group {
ExampleView()
ExampleView()
.environment(\.colorScheme, .dark)
}.previewLayout(.sizeThatFits)
}
}
您会得到如下所示的输出:
为了使第二个预览显示在深色背景上,请通过在视图上调用 .background(Color(UIColor.systemBackground)) 来添加它:
struct ExampleView_Previews: PreviewProvider {
static var previews: some View {
Group {
ExampleView()
ExampleView()
.background(Color(UIColor.systemBackground))
.environment(\.colorScheme, .dark)
}.previewLayout(.sizeThatFits)
}
}
您会得到两个如下所示的预览:
额外选项
您可以进行多种修改。首先,根据单元所在的层,您可以将UIColor.systemBackground 替换为UIColor.secondarySystemBackground 或UIColor.tertiarySystemBackground。阅读更多关于动态系统颜色的信息in the human interface guidelines 或the UI Element Colors portion of the UIColor developer documentation。
最后,如果您要经常使用它并且不想每次都写出对UIColor 的整个调用,那么在Color 上创建一个扩展并定义它们可能是个好主意作为静态变量:
extension Color {
static let systemBackground = Color(UIColor.systemBackground)
static let secondarySystemBackground = Color(UIColor.secondarySystemBackground)
static let tertiarySystemBackground = Color(UIColor.tertiarySystemBackground)
}
然后你可以用更好的Color.systemBackground 替换你对Color(UIColor.systemBackground) 的调用。