无法使用 SwiftUI 实现暗模式
Not able to achieve dark mode using SwiftUI
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView().environment(\.colorScheme, .dark)
}
}
我正在使用上面的代码在我的演示项目上实现暗模式,但它不起作用。
任何帮助或见解将不胜感激。
这似乎是 Xcode 11.0 测试版中的错误。一个临时的解决方法是将您的内容包装在 NavigationView
中。
例如以下代码在深色模式预览中不会生效:
var body: some View {
Text("Hello World")
}
但是在 NavigationView
中包装内容后,暗模式预览按预期工作:
var body: some View {
NavigationView {
Text("Hello World")
}
}
结果:
显然是一个错误。即使做 MyView().colorScheme(.dark)
也行不通。
Context-click(右键单击,或 Ctrl-click)'play' 按钮(用于模拟 运行 您的应用程序)。单击调试预览。打开调试区域。然后,您可以使用环境覆盖来配置 dark/light 模式、动态类型、可访问性设置等。
顺便说一句,要打开环境覆盖设置,请转到调试器上方并按此按钮:
深色模式在预览时工作了一半,它只是忘记绘制背景。
以下解决方法允许您在预览功能中将 .darkModeFix()
添加到 ContentView()
。您可以选择添加 false
作为参数以关闭黑暗模式。
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
Group {
ContentView()
.darkModeFix()
}
}
}
只需在项目的某处添加以下内容:
public struct DarkView<Content> : View where Content : View {
var darkContent: Content
var on: Bool
public init(_ on: Bool, @ViewBuilder content: () -> Content) {
self.darkContent = content()
self.on = on
}
public var body: some View {
ZStack {
if on {
Spacer()
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.background(Color.black)
.edgesIgnoringSafeArea(.all)
darkContent.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity).background(Color.black).colorScheme(.dark)
} else {
darkContent
}
}
}
}
extension View {
public func darkModeFix(_ on: Bool = true) -> DarkView<Self> {
DarkView(on) {
self
}
}
}
它修复了预览,但没有更改我的代码
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ZStack {
Color.black.edgesIgnoringSafeArea(.all)
ContentView().environment(\.colorScheme, .dark)
}
ContentView().environment(\.colorScheme, .light)
}
}
}
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView().environment(\.colorScheme, .dark)
}
}
我正在使用上面的代码在我的演示项目上实现暗模式,但它不起作用。
任何帮助或见解将不胜感激。
这似乎是 Xcode 11.0 测试版中的错误。一个临时的解决方法是将您的内容包装在 NavigationView
中。
例如以下代码在深色模式预览中不会生效:
var body: some View {
Text("Hello World")
}
但是在 NavigationView
中包装内容后,暗模式预览按预期工作:
var body: some View {
NavigationView {
Text("Hello World")
}
}
结果:
显然是一个错误。即使做 MyView().colorScheme(.dark)
也行不通。
Context-click(右键单击,或 Ctrl-click)'play' 按钮(用于模拟 运行 您的应用程序)。单击调试预览。打开调试区域。然后,您可以使用环境覆盖来配置 dark/light 模式、动态类型、可访问性设置等。
顺便说一句,要打开环境覆盖设置,请转到调试器上方并按此按钮:
深色模式在预览时工作了一半,它只是忘记绘制背景。
以下解决方法允许您在预览功能中将 .darkModeFix()
添加到 ContentView()
。您可以选择添加 false
作为参数以关闭黑暗模式。
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
Group {
ContentView()
.darkModeFix()
}
}
}
只需在项目的某处添加以下内容:
public struct DarkView<Content> : View where Content : View {
var darkContent: Content
var on: Bool
public init(_ on: Bool, @ViewBuilder content: () -> Content) {
self.darkContent = content()
self.on = on
}
public var body: some View {
ZStack {
if on {
Spacer()
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.background(Color.black)
.edgesIgnoringSafeArea(.all)
darkContent.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity).background(Color.black).colorScheme(.dark)
} else {
darkContent
}
}
}
}
extension View {
public func darkModeFix(_ on: Bool = true) -> DarkView<Self> {
DarkView(on) {
self
}
}
}
它修复了预览,但没有更改我的代码
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ZStack {
Color.black.edgesIgnoringSafeArea(.all)
ContentView().environment(\.colorScheme, .dark)
}
ContentView().environment(\.colorScheme, .light)
}
}
}