如何以编程方式获取颜色资源目录中包含的所有颜色?

How can I programmatically obtain all colors included in Color Assets catalog?

我有一个包含自定义颜色的颜色资产目录。有没有办法在应用程序中获取和显示它们? 像这样

func getColorsFromAssetCatalog() -> [UIColor]? {
      //Somehow return those colors
}

let colorsInCatalog = getColorsFromAssetCatalog()

for color in colorsInCatalog {
       // Do something
}

您可以使用此方法从资产中获取颜色

let color = UIColor(named: "MyCustomColorName")

您可以声明您支持的自定义颜色的枚举

enum CustomColors
{
   case CustomYellow
   case CustomRed
}

在 switch case 中,您可以像这样传递资产的颜色:

   switch(CustomColorName)
   {
       case CustomYellow : 
        return UIColor(named: "MyCustomColorName")
    }

我想你必须像

一样手动获取它们
UIColor(named: "Color1")
UIColor(named: "Color2")
...

因此,我建议您为颜色和所有颜色情况创建具有静态常量的自定义结构

struct Color {

    static let allCases = [Color.color1, Color.color2, ...]

    static let color1 = UIColor(named: "Color1")!
    static let color2 = UIColor(named: "Color2")!
    ...
}

然后您可以通过获取

从 xcassets 目录中的颜色集中获取所有颜色
Color.allCases

目前无法请求资产目录以编程方式告诉您它包含的所有资产。也就是说,没有 API,恕我直言,它可以让您获取您在资产目录中添加的颜色名称(或其他资产名称)。
当然,如果您已经知道名称,则可以获取 color/asset。

此外,资产目录编译成 Assets.car 这是不可读的,因此尝试读取该文件也是徒劳的。

无论如何......回到你的案例,你将不得不手动维护一些机制,如 Enum 来跟踪颜色。


解决方案:

  • 为资产目录添加颜色;说名为 "WeirdOrange"
  • 使用 Enum 来维护您的自定义颜色名称,例如:

    enum Colors: String {
        //... previous cases
        case weirdOrange = "WeirdOrange" //... now we add this one
    }
    
  • 在应用程序中将其用作:

    UIColor(named: Colors.weirdOrange.rawValue)
    

示例:

让我们根据您的目的对其进行微调:

enum Colors: String, CaseIterable {
    case funkyMunky = "FunkyMunky"
    case weirdOrange = "WeirdOrange"
    case popBlue = "PopBlue"
    case murkyPoo = "MurkyPoo"

    static var assetCatalogued: [UIColor] {
        return self.allCases.compactMap { (colorCase) -> UIColor? in
            return UIColor(named: colorCase.rawValue)
        }
    }
}

for color in Colors.assetCatalogued {
    //Do something
    print(color)
}

注意:

  • 以 运行 为例,要么更改颜色名称,要么添加具有给定名称的颜色,否则 Colors.assetCatalogued 将不会 return 任何 UIColors
  • CaseIterable 用于 .allCases
  • 当 adding/removing 相关颜色资产
  • 时,您必须手动 add/remove

对 UIColor 进行扩展,如下所示:

extension UIColor {
    public class var appBackgroundColor: UIColor { UIColor(named : "appBackgroundColor") ?? UIColor.white }
}

现在您可以在整个应用程序中轻松访问它,只需使用:

UIColor.appBackgroundColor

唯一的缺点是您必须为资产和扩展程序添加颜色