我已经在SwiftUI中创建了一个自定义工作表,其背景颜色为白色.background(Color.white)
现在,我希望当用户在iOS上打开暗模式时将背景色更改为黑色。
但是我找不到背景的动态颜色,例如Color.primary
的文本颜色等等。
那么当打开黑暗模式时,有什么方法可以将背景颜色更改为黑色吗?
答案 0 :(得分:30)
要详细说明现有的两个答案,有两种方法可以根据您要达到的目的,根据亮或暗模式(也称为colorScheme
)对背景进行更改。
如果您将背景颜色设置为白色(因为这是默认的背景颜色),并且希望系统能够在用户切换为暗模式时进行更新,请将.background(Color.white)
更改为.background(Color(UIColor.systemBackground))
( umayanga的答案)。
例如
// Use default background color based on light/dark mode
struct ContentView: View {
...
var body: some View {
// ... to any view
.background(Color(UIColor.systemBackground))
}
如果要基于设备处于亮或暗模式自定义视图的颜色,则可以执行此操作(根据Asperi的回答):
// Use custom background color based on light/dark mode
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
...
var body: some View {
// ... to any view
.background(colorScheme == .dark ? Color.black : Color.white)
}
请注意,许多SwiftUI视图默认将其背景色设置为.systemBackground
,因此,如果您使用的是ScrollView,List,Form等,它们将使用默认的系统背景色,而您不会除非要自定义,否则需要使用.background
。
答案 1 :(得分:8)
将% Provided
更改为.background(Color.white)
答案 2 :(得分:5)
这是可行的方法(适用于任何颜色)
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
...
var body: some View {
// ... to any view
.background(colorScheme == .dark ? Color.black : Color.white)
}
}
答案 3 :(得分:5)
如果您想要直接在Color
上工作的东西(例如您在Color.primary
上工作),并且在iOS 和macOS (UIColor
不适用于macOS),您可以使用以下简单的Color
扩展名,该扩展名使用条件编译在任何一个OS上都能正常工作。
然后,您可以像其他任何SwiftUI Color
一样,从代码中的其他位置轻松访问它们。例如:
let backgroundColor = Color.background
无需使用以下方法检查colorScheme
或userInterfaceStyle
:当用户在明暗模式之间切换时,操作系统将自动切换。
我还添加了“第二”和“第三”颜色,这些颜色在macOS上有些主观,但是如果需要,您可以随时将其更改为其他一些NSColor
属性。
Swift v5.2:
import SwiftUI
public extension Color {
#if os(macOS)
static let background = Color(NSColor.windowBackgroundColor)
static let secondaryBackground = Color(NSColor.underPageBackgroundColor)
static let tertiaryBackground = Color(NSColor.controlBackgroundColor)
#else
static let background = Color(UIColor.systemBackground)
static let secondaryBackground = Color(UIColor.secondarySystemBackground)
static let tertiaryBackground = Color(UIColor.tertiarySystemBackground)
#endif
}
答案 4 :(得分:3)
如果您希望在明/暗模式下使用自定义背景色,那么我建议您在资产文件夹中使用不同外观的自定义颜色值创建新颜色集。
这样,当切换显示模式无需时,背景颜色将自动改变。
然后使用颜色列表的这种颜色作为Controller View背景。
答案 5 :(得分:1)
我们还可以通过将颜色添加到Assets
文件夹中来自动更改颜色。
答案 6 :(得分:1)
查看此页面,了解为各种 UI 元素推荐的系统颜色。使用这些应该注意暗/亮模式切换。
答案 7 :(得分:0)
您可以如下所示扩展UIColor
extension UIColor{
struct Custom {
static var black: UIColor{
if #available(iOS 13, *) {
return UIColor.init { (trait) -> UIColor in
return trait.userInterfaceStyle == .dark ? UIColor.white : UIColor.black
}
}
return UIColor.black
}
}
}
然后用作.background(Color(UIColor.Custom.black))
启用/禁用暗移动后,您的视图将更新颜色
答案 8 :(得分:0)
我个人不喜欢在Assets
文件夹中创建颜色集。
我希望代码中包含它,因此最佳做法如下:
extension Color {
static var primaryColor: Color {
Color(UIColor { $0.userInterfaceStyle == .dark ? UIColor(red: 255, green: 255, blue: 255, alpha: 1) : UIColor(red: 200, green: 200, blue: 200, alpha: 1) })
}
}
使用:
.background(Color.primaryColor)
答案 9 :(得分:0)
SwiftUI 具有自动适应配色方案的颜色。例如,您可以使用 .background(Color(.textBackgroundColor))
获得适当的背景颜色以呈现文本,而不管配色方案如何。