SwiftUI:获取动态背景色(暗模式或亮模式)

时间:2020-03-13 14:53:48

标签: ios macos colors background swiftui

是否有一种方法可以系统地访问SwiftUI视图的标准动态背景颜色,而不管用户是处于亮模式还是暗模式?

例如,我知道以下方法可用于获取主要颜色(例如文本):

let textColor = Color.primary

...但是我看不到任何类似的背景色。

let backgroundColor = Color.??? // Not available

我正在寻找在iOS和macOS上都可以使用的东西。

1 个答案:

答案 0 :(得分:2)

因此,在SwiftUI的独立于操作系统的Color类中似乎没有内置任何此类属性;但是,UIColorNSColor do 为此提供访问器(分别在iOS和macOS上),您可以使用这些较旧的颜色对象来初始化SwiftUI Color对象。

因此,可以使用Color的简单扩展来实现所需的功能,如下所示,该扩展使用条件编译在任一OS上正常工作。

无需使用以下方法检查colorSchemeuserInterfaceStyle:当用户在明暗模式之间切换时,操作系统将自动切换。

我还添加了“第二”和“第三”颜色,这些颜色在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
}

然后,您可以像其他任何SwiftUI Color一样,从代码中的其他位置轻松访问它们。例如:

let backgroundColor = Color.background