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

lymnna71  于 2023-03-16  发布在  Swift
关注(0)|答案(5)|浏览(144)

我有一个包含自定义颜色的颜色资源目录。有没有办法在应用程序中获取并显示它们?类似于以下内容

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

let colorsInCatalog = getColorsFromAssetCatalog()

for color in colorsInCatalog {
       // Do something
}
q0qdq0h2

q0qdq0h21#

目前,无法请求“资源目录”以编程方式告诉您它包含的所有资源。即,没有API(恕我直言)可让您获取已添加到“资源目录”中的颜色名称(或其他资源名称)。
当然,如果您已经知道名称,则可以获取颜色/资源。
此外,资产目录编译为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
  • CaseIterable用于.allCases
  • 添加/移除相关颜色资源时,您必须手动添加/移除案例
wwodge7n

wwodge7n2#

您可以使用以下命令从资源获取颜色

let color = UIColor(named: "MyCustomColorName")

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

enum CustomColors
{
   case CustomYellow
   case CustomRed
}

在一个切换用例中,你可以像这样从资源中传递颜色:

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

8xiog9wr3#

我想你得手动取出来

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
2guxujil

2guxujil4#

对UIColor进行扩展,如下所示:

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

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

UIColor.appBackgroundColor

唯一的缺点是,你必须添加颜色的资产,也在扩展

k2arahey

k2arahey5#

在Xcode 14.2中,似乎仍然没有可以通过编程方式获取Color Assets Catalog中包含的颜色的功能。
但是,我有相同的要求,我已经使用SwiftGen(https://github.com/SwiftGen/SwiftGen)在预处理中将颜色资源转换为Swift5源代码。

xcassets:
  inputs: /dir/to/search/for/imageset/assets
  outputs:
    templateName: swift5
    output: Assets.swift

有关https://github.com/SwiftGen/SwiftGen#asset-catalog给出的示例,请参见www.example.com。
添加或修改颜色后,我会运行swiftgen来更新源文件,并且可以使用其他答案中描述的一些辅助函数以编程方式访问所有资源。

相关问题