Xcode 11-SwiftUI预览暗模式

Xcode 11-SwiftUI预览暗模式,swiftui,xcode11,Swiftui,Xcode11,在Xcode 11中,我们可以在应用程序运行时通过切换调试区域底部的环境覆盖来启用暗模式,如下所示 SwiftUI有一个画布编辑器,可以在构建界面时生成应用程序的实时预览 有没有办法在这些预览中切换到暗模式?在正在预览的文件的底部应该有类似的内容。这是Xcode用于生成预览的内容: #如果调试 结构内容视图\u预览:PreviewProvider{ 静态var预览:一些视图{ ContentView() } } #恩迪夫 要将预览更改为暗模式,只需指定一个颜色方案: 静态var预览:一些视图

在Xcode 11中,我们可以在应用程序运行时通过切换调试区域底部的环境覆盖来启用暗模式,如下所示

SwiftUI有一个画布编辑器,可以在构建界面时生成应用程序的实时预览


有没有办法在这些预览中切换到暗模式?

在正在预览的文件的底部应该有类似的内容。这是Xcode用于生成预览的内容:

#如果调试
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}
#恩迪夫
要将预览更改为暗模式,只需指定一个
颜色方案

静态var预览:一些视图{
ContentView().colorScheme(.深色)
}
或者,您甚至可以选择同时预览明暗模式:

静态var预览:一些视图{
团体{
ContentView().colorScheme(.light)
ContentView().colorScheme(.深色)
}
}
我建议观看本期课程,了解更多SwiftUI示例以及预览功能的强大程度

注意:在撰写本文时,您需要一个NavigationView作为.environment(.colorScheme,.dark)的顶级视图才能工作。但是(大的)导航栏会覆盖颜色块,所以两个导航栏修改器会使导航栏变小并隐藏它。。。某种程度上。这可能是Xcode中的错误

我在Xcode 11.2.1上对此进行了测试,
NavigationView
的问题仍然存在。除非将整个视图包装在
NavigationView
中,否则环境似乎不会改变。您可以尝试使用
.navigationBarTitle(“”
&
.navigationBarHidden(true)
隐藏
导航视图

例如:

struct ContentView: View {
    var body: some View {
        NavigationView {
            Text("Light vs Dark Mode")

            // Uncomment these lines if you don't want the navigation bar
            // .navigationBarTitle("")
            // .navigationBarHidden(true)

            // You can also apply a colorScheme here
            // which will impact how the view looks when the app
            // is launched on device. Regardless of the users theme settings
        }// .environment(\.colorScheme, .dark)
    }
}

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

        // If you want you can display both schemes in a group
        Group {
            ContentView()
            .environment(\.colorScheme, .light)

           ContentView()
           .environment(\.colorScheme, .dark)
       }
    }
}
暗模式下的预览示例:

TLDR: 只需将
.background(Color(UIColor.systemBackground))
.environment(\.colorScheme.dark)
修改器添加到预览中即可。对于解释,例子,一些修改和一些技巧,使它更漂亮,甚至更简单,请阅读整个答案

解释 我知道这个问题已经很老了,但我已经找到了一种实现起来不太痛苦,并且不需要在NavigationView中进行任何包装的方法。此外,它还保留了
.previewLayout(.sizeThatFits)
的正确行为

本质上,当您定义符合
PreviewProvider
的结构时,您只定义了内容,但预览的背景由Xcode为您管理。因此,应用
.environment(\.colorScheme.dark)
只会将实际视图更改为暗模式,而不会更改背景。解决这个问题的原因很简单,它为视图添加了一个背景,覆盖了预览的所有白色背景

修复本身也相当简单-您需要做的只是在预览中为视图添加背景。因此,对于这样一个简单的视图:

结构示例视图:视图{ var body:一些观点{ 文本(“你好,世界!”) } }
还有一组预览,如下所示:

struct ExampleView\u预览:PreviewProvider{
静态var预览:一些视图{
团体{
示例视图()
示例视图()
.environment(\.colorScheme,.dark)
}.previewLayout(.sizeThatFits)
}
}
您得到的输出如下所示:

要使第二个预览显示在深色背景上,请通过在视图上调用
.background(Color(UIColor.systemBackground))
添加它:

struct ExampleView\u预览:PreviewProvider{
静态var预览:一些视图{
团体{
示例视图()
示例视图()
.background(颜色(UIColor.systemBackground))
.environment(\.colorScheme,.dark)
}.previewLayout(.sizeThatFits)
}
}
您会看到两个预览,如下所示:

额外选择 您可以进行一些修改。首先,根据单元格所在的层,您可以将
UIColor.systemBackground
替换为
UIColor.secondarySystemBackground
UIColor.tertiarySystemBackground
。了解有关动态系统颜色或颜色的更多信息

最后,如果您要经常使用它,并且不想每次都写出对
UIColor
的整个调用,那么最好在
Color
上创建一个扩展,并将它们定义为静态变量:

扩展颜色{
静态let systemBackground=Color(UIColor.systemBackground)
静态let secondarySystemBackground=Color(UIColor.secondarySystemBackground)
静态let tertiarystembackground=Color(UIColor.tertiarystembackground)
}

然后,您可以将对
Color(UIColor.systemBackground)
的调用替换为更好的
Color.systemBackground

仅供参考:我必须在两个ContentView()周围添加一个“组”,以使最后一个有效。这对任何人都有效吗?我在Beta1的黑暗模式下工作真是太痛苦了。当我在运行模拟器时手动切换到暗模式时,即使是颜色资源目录中的模式也无法工作。当然,所有默认的apple控件都可以工作……如果预览没有显示暗模式,请检查此选项。如何通过编程检查颜色方案是暗还是亮?这是因为我需要在图像为黑色时更改图像。当您在上下文中单击预览旁边的“播放”按钮并选择“调试预览”时,您将获得一个调试会话,并且可以对您的SwiftUI预览使用环境覆盖和其他调试功能。这是否回答了您的问题?这个问题仍然存在于Xcode 11.3.1中。在没有导航视图的情况下,在模拟器中可以正常工作,但是…它是