我有一个包含自定义颜色的颜色资源目录。有没有办法在应用程序中获取并显示它们?类似于以下内容
func getColorsFromAssetCatalog() -> [UIColor]? { //Somehow return those colors } let colorsInCatalog = getColorsFromAssetCatalog() for color in colorsInCatalog { // Do something }
q0qdq0h21#
目前,无法请求“资源目录”以编程方式告诉您它包含的所有资源。即,没有API(恕我直言)可让您获取已添加到“资源目录”中的颜色名称(或其他资源名称)。当然,如果您已经知道名称,则可以获取颜色/资源。此外,资产目录编译为Assets.car,这是不可读的,因此尝试读取该文件也是徒劳的。无论如何...回到您的案例,您将不得不手动维护一些机制,如Enum来跟踪颜色。
Assets.car
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
wwodge7n2#
您可以使用以下命令从资源获取颜色
let color = UIColor(named: "MyCustomColorName")
可以声明支持的自定义颜色的枚举
enum CustomColors { case CustomYellow case CustomRed }
在一个切换用例中,你可以像这样从资源中传递颜色:
switch(CustomColorName) { case CustomYellow : return UIColor(named: "MyCustomColorName") }
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
2guxujil4#
对UIColor进行扩展,如下所示:
extension UIColor { public class var appBackgroundColor: UIColor { UIColor(named : "appBackgroundColor") ?? UIColor.white } }
现在,您只需使用以下工具即可在整个应用中轻松访问它:
UIColor.appBackgroundColor
唯一的缺点是,你必须添加颜色的资产,也在扩展
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来更新源文件,并且可以使用其他答案中描述的一些辅助函数以编程方式访问所有资源。
5条答案
按热度按时间q0qdq0h21#
目前,无法请求“资源目录”以编程方式告诉您它包含的所有资源。即,没有API(恕我直言)可让您获取已添加到“资源目录”中的颜色名称(或其他资源名称)。
当然,如果您已经知道名称,则可以获取颜色/资源。
此外,资产目录编译为
Assets.car
,这是不可读的,因此尝试读取该文件也是徒劳的。无论如何...回到您的案例,您将不得不手动维护一些机制,如
Enum
来跟踪颜色。溶液:
Enum
来维护您的自定义颜色名称,例如:示例:
让我们根据您的目的对其进行微调:
注:
Colors.assetCatalogued
将不返回任何UIColor
CaseIterable
用于.allCases
wwodge7n2#
您可以使用以下命令从资源获取颜色
可以声明支持的自定义颜色的枚举
在一个切换用例中,你可以像这样从资源中传递颜色:
8xiog9wr3#
我想你得手动取出来
因此,我建议您创建一个自定义结构体,其中包含用于颜色和所有颜色大小写的静态常量
然后,您可以从xcassets目录中的颜色集获取所有颜色,方法是获取
2guxujil4#
对UIColor进行扩展,如下所示:
现在,您只需使用以下工具即可在整个应用中轻松访问它:
唯一的缺点是,你必须添加颜色的资产,也在扩展
k2arahey5#
在Xcode 14.2中,似乎仍然没有可以通过编程方式获取Color Assets Catalog中包含的颜色的功能。
但是,我有相同的要求,我已经使用SwiftGen(https://github.com/SwiftGen/SwiftGen)在预处理中将颜色资源转换为Swift5源代码。
有关https://github.com/SwiftGen/SwiftGen#asset-catalog给出的示例,请参见www.example.com。
添加或修改颜色后,我会运行swiftgen来更新源文件,并且可以使用其他答案中描述的一些辅助函数以编程方式访问所有资源。