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

时间:2019-03-14 08:47:42

标签: ios swift uicolor

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

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

let colorsInCatalog = getColorsFromAssetCatalog()

for color in colorsInCatalog {
       // Do something
}

4 个答案:

答案 0 :(得分:0)

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

let color = UIColor(named: "MyCustomColorName")

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

enum CustomColors
{
   case CustomYellow
   case CustomRed
}

在转换盒中,您可以像这样通过资产传递颜色:

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

答案 1 :(得分: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.allCases

答案 2 :(得分:0)

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

此外,资产目录会编译为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将不返回任何UIColor s
  • CaseIterable用于.allCases
  • 添加/删除相关颜色资产时,您必须手动添加/删除案例

答案 3 :(得分:0)

扩展UIColor,如下所示:

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

现在,您只需使用以下内容即可轻松在整个应用中访问它:

UIColor.appBackgroundColor

唯一的缺点是您必须在资产以及扩展名中添加颜色