SwiftUI:使用资产目录中的颜色集

JWK*_*JWK 6 colors uicolor asset-catalog swiftui

在SwiftUI中,我们可以使用以下方法从资产目录中的颜色集中获取颜色:

extension Color {
  static let coral = Color("coral")
}
Run Code Online (Sandbox Code Playgroud)

这需要字符串类型的名称,并且在使用许多颜色集时变得非常乏味。还有另一种获取颜色集的方法,类似于使用图像文字从资产目录中获取图像的方法吗?或者,只是少一些多余的东西。

如果没有,如何在SwiftUI中以编程方式创建动态颜色?例如,这是在UIKit中完成的方式:

extension UIColor {
    static let dynamicColor = UIColor { traitCollection in
        return traitCollection.userInterfaceStyle == .dark ? .black : .white
    }
}
Run Code Online (Sandbox Code Playgroud)

Oll*_*erg 13

最简单的方法是添加Color扩展

extension Color {
    static let primary = Color("Primary")
    static let secondary = Color("Secondary")
}
Run Code Online (Sandbox Code Playgroud)

然后就很容易使用了

Text("My Primary Color")
     .foregroundColor(.primary)
Run Code Online (Sandbox Code Playgroud)

如果您需要将其用作UIColor,则对 UIColor 进行扩展并将实现更改为

Text("My Primary UIColor")
     .foregroundColor(Color(uiColor: .primary))
Run Code Online (Sandbox Code Playgroud)


Joh*_*nny 7

我想分享一种在资产目录中定义动态颜色的替代方法,但无需编写繁琐的代码,例如

Color("yellow")
Run Code Online (Sandbox Code Playgroud)

1. 像往常一样在资产目录中定义您的颜色

在此处输入图片说明

2. 在你的代码中,找到一个地方将你的颜色定义为一个变量,在我的例子中它会是这样的:

extension Color {
    static let ui = Color.UI()
    
    struct UI {
         let yellow = Color("yellow")
    }
}
Run Code Online (Sandbox Code Playgroud)

3. 完成

像这样使用你的颜色:

Text("Hello").background(Color.ui.yellow)
Run Code Online (Sandbox Code Playgroud)

这只需要在您的代码中编写硬编码颜色 1 次。

  • 如果在“let Yellow”前面设置“static”,则可以删除“static let ui = Color.UI()”,这样当您需要颜色时就不必获取“UI”的实例 (4认同)

Asp*_*eri 4

如果没有,如何在 SwiftUI 中以编程方式创建动态颜色?例如,在 UIKit 中是这样完成的:

这几乎是一样的:

extension Color {
    static let dynamicColor = Color(UIColor { traitCollection in
        return traitCollection.userInterfaceStyle == .dark ? .black : .white
    })
}
Run Code Online (Sandbox Code Playgroud)