如何以编程方式获取颜色资源目录中包含的所有颜色?
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 任何 UIColor
s
CaseIterable
用于 .allCases
- 当 adding/removing 相关颜色资产
时,您必须手动 add/remove
对 UIColor 进行扩展,如下所示:
extension UIColor {
public class var appBackgroundColor: UIColor { UIColor(named : "appBackgroundColor") ?? UIColor.white }
}
现在您可以在整个应用程序中轻松访问它,只需使用:
UIColor.appBackgroundColor
唯一的缺点是您必须为资产和扩展程序添加颜色
我有一个包含自定义颜色的颜色资产目录。有没有办法在应用程序中获取和显示它们? 像这样
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 任何UIColor
s CaseIterable
用于.allCases
- 当 adding/removing 相关颜色资产 时,您必须手动 add/remove
对 UIColor 进行扩展,如下所示:
extension UIColor {
public class var appBackgroundColor: UIColor { UIColor(named : "appBackgroundColor") ?? UIColor.white }
}
现在您可以在整个应用程序中轻松访问它,只需使用:
UIColor.appBackgroundColor
唯一的缺点是您必须为资产和扩展程序添加颜色