首页 > 解决方案 > 如何以编程方式获取颜色资产目录中包含的所有颜色?

问题描述

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

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

let colorsInCatalog = getColorsFromAssetCatalog()

for color in colorsInCatalog {
       // Do something
}

标签: iosswiftuicolor

解决方案


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

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

无论如何...回到你的情况,你必须手动维护一些机制,比如Enum跟踪颜色。


解决方案:

  • 为资产目录添加颜色;说名为“奇怪的橙色”
  • 使用 anEnum来维护您的自定义颜色名称,例如:

    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不会返回任何UIColors
  • 用于CaseIterable_.allCases
  • 添加/删除相关颜色资产时,您必须手动添加/删除案例

推荐阅读