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

问题描述 投票:1回答:3

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

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

let colorsInCatalog = getColorsFromAssetCatalog()

for color in colorsInCatalog {
       // Do something
}
ios swift uicolor
3个回答
0
投票

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

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

无论如何......回到你的情况,你将不得不手动维护像Enum一样的机制来跟踪颜色。


解:

  • 为资产目录添加颜色;说名为“WeirdOrange”
  • 使用Enum维护自定义颜色名称,例如: enum Colors: String { //... previous cases case weirdOrange = "WeirdOrange" //... now we add this one }
  • 在应用程序中使用它: UIColor(named: Colors.weirdOrange.rawValue)

Example:

让我们为你的目的微调一点:

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
  • 添加/删除相关颜色资源时,您必须手动添加/删除案例

0
投票

您可以使用此功能从资产中获取颜色

let color = UIColor(named: "MyCustomColorName")

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

enum CustomColors
{
   case CustomYellow
   case CustomRed
}

在切换案例中,您可以传递资产的颜色,如下所示:

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

0
投票

我想你必须手动得到它们

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 Set的所有颜色

Color.allCases
© www.soinside.com 2019 - 2024. All rights reserved.