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

SwiftUI: Using Color Set from Asset Catalog

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

extension Color {
    static let coral = Color("coral")
}

这需要字符串类型的名称,并且对于许多颜色集来说会变得非常乏味。是否有另一种获取颜色集的方法类似于我们使用图像文字从资产目录中获取图像的方式?或者,只是一些不那么多余的东西。

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

extension UIColor {
    static let dynamicColor = UIColor { [=11=].userInterfaceStyle == .dark ? .black : .white }
}

我很确定 Apple 会将其留给开发人员。例如,您可以为 SwiftUI 颜色编写自定义 SwiftGen(或稍等)模板。 https://github.com/SwiftGen/SwiftGen#colors

If not, how are dynamic colors programmatically created in SwiftUI? For example, this is how it would be done in UIKit:

这样可以差不多了:

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

我想分享另一种在资产目录中定义动态颜色的方法, 但无需编写像

这样繁琐的代码
Color("yellow")

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

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

extension Color {
    static let ui = Color.UI()
    
    struct UI {
         let yellow = Color("yellow")
    }
}

3。完成

像这样使用你的颜色:

Text("Hello").background(Color.ui.yellow)

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

这是另一种方法:

import SwiftUI

enum AssetsColor : String
{
    case assetColorA
    case assetColorB
}

extension Color
{
    static func uiColor(_ name: AssetsColor) -> Color
    {
        return Color(name.rawValue)
    }
}

...

.backgroundColor(Color.uiColor(.assetColorA))

最简单的方法是为 Color

添加一个扩展
extension Color {
    static let primary = Color("Primary")
    static let secondary = Color("Secondary")
}

然后就是好用

Text("My Primary Color")
     .foregroundColor(.primary)

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

Text("My Primary UIColor")
     .foregroundColor(Color(uiColor: .primary))