在SwiftUI中打开暗模式时更改背景色

在SwiftUI中打开暗模式时更改背景色,swiftui,Swiftui,我已经在SwiftUI中创建了一个自定义工作表,背景颜色为白色。背景(color.White) 现在,当用户在iOS上打开黑暗模式时,我希望背景颜色变为黑色。 但我找不到一种动态的背景颜色,比如color.primary用于文本的颜色等 那么,当黑暗模式打开时,有没有办法将背景颜色更改为黑色?将.background(color.white)更改为.background(color(UIColor.systemBackground))以下是可能的方法(适用于任何颜色) 为了详细说明这两个现有的答

我已经在SwiftUI中创建了一个自定义工作表,背景颜色为白色
。背景(color.White)

现在,当用户在iOS上打开黑暗模式时,我希望背景颜色变为黑色。 但我找不到一种动态的背景颜色,比如
color.primary
用于文本的颜色等


那么,当黑暗模式打开时,有没有办法将背景颜色更改为黑色?

.background(color.white)
更改为
.background(color(UIColor.systemBackground))
以下是可能的方法(适用于任何颜色)


为了详细说明这两个现有的答案,有两种方法可以根据您想要实现的目标,根据明暗模式(又名
colorScheme
)改变背景

如果您将背景色设置为白色,因为这是默认的背景色,并且希望系统能够在用户切换到暗模式时更新背景色,请将
.background(color.white)
更改为
.background(color(UIColor.systemBackground))
(umayanga的回答)

e、 g

如果要根据设备处于亮模式或暗模式自定义视图的颜色,可以执行此操作(来自Asperi的回答):


请注意,许多SwiftUI视图在默认情况下将其背景色设置为
.systemBackground
,因此,如果您使用的是滚动视图、列表、表单等,它们将使用默认的系统背景色,并且您无需使用
.background
,除非您想要自定义它。

您可以扩展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(颜色(UIColor.Custom.black))


当启用/禁用暗移时,视图将更新颜色

如果您想要直接从
颜色
(就像您使用
color.primary
)工作的内容,并且iOS和macOS上的功能(
UIColor
在macOS上不起作用),您可以使用以下简单的
颜色
扩展,它使用条件编译在任一操作系统上正常工作

然后,您只需像任何其他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
}

如果您希望在明暗模式下使用自定义背景色,我建议您在资源文件夹中创建新的颜色集,为不同的外观使用自定义颜色值

这样,在切换显示模式时,背景颜色将自动改变,而无需添加一行代码

然后使用颜色列表中的此颜色作为控制器视图背景


我们还可以通过将它们添加到
资产
文件夹来自动更改颜色

  • Assets
    文件夹中添加新颜色集

  • 添加颜色集后,您可以根据自己的方便对其命名,并且可以为
    任何外观
    深色外观
    浅色外观
    配置颜色。

  • 要访问新添加的颜色集,需要遵循
    color

    Color("your_color_set_name")
    
    
  • 为了获得最佳实践,您不希望代码中填充颜色集名称的字符串值。您可以创建一个扩展,使使用更加实用和有序

    extension Color {
            static var tableViewBackground: Color {
                Color("tableViewBackground")
            }
        }
    
    

  • 我个人不喜欢在
    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)
    

    SwiftUI具有自动适应配色方案的颜色。例如,您可以使用
    .background(Color(.textBackgroundColor))
    为呈现文本获取合适的背景色,而不考虑颜色方案。

    查看此页面,了解各种UI元素的推荐系统颜色。使用这些应注意暗/光模式切换


    .systemBackground在亮模式下为白色,但在暗模式下为灰色。但对于iOS 14小部件,暗模式的默认背景为纯黑色。@暗模式的myatmins systemBackground为纯黑色。但如果视图位于图纸上,则为灰色(systemGray6)
    extension Color {
            static var tableViewBackground: Color {
                Color("tableViewBackground")
            }
        }
    
    
    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)