我有自定义颜色的颜色资产目录。有没有办法在应用程序中获取和显示它们?像这样的东西
func getColorsFromAssetCatalog() -> [UIColor]? {
//Somehow return those colors
}
let colorsInCatalog = getColorsFromAssetCatalog()
for color in colorsInCatalog {
// Do something
}
目前,无法请求资产目录以编程方式告诉您它包含的所有资产。即没有API,imho,它可以让你获取你在资产目录中添加的颜色名称(或其他资产名称)。 如果您已经知道名称,则可以获取颜色/资产。
此外,资产目录编译成Assets.car
,这是不可读的,因此尝试读取该文件也是徒劳的。
无论如何......回到你的情况,你将不得不手动维护像Enum
一样的机制来跟踪颜色。
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
sCaseIterable
为.allCases
您可以使用此功能从资产中获取颜色
let color = UIColor(named: "MyCustomColorName")
您可以声明支持的自定义颜色枚举
enum CustomColors
{
case CustomYellow
case CustomRed
}
在切换案例中,您可以传递资产的颜色,如下所示:
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 Set的所有颜色
Color.allCases