Как программно получить все цвета, включенные в каталог Color Assets? - PullRequest
1 голос
/ 14 марта 2019

У меня есть каталог цветов с моими пользовательскими цветами. Есть ли способ получить и отобразить их в приложении? Как то так

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

let colorsInCatalog = getColorsFromAssetCatalog()

for color in colorsInCatalog {
       // Do something
}

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Я думаю, вам придется получить их вручную, как

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
0 голосов
/ 15 марта 2019

В настоящее время нет способа запросить каталог активов, чтобы программно сказать вам, какие все активы он содержит. то есть, нет никакого API, imho, которое позволило бы вам выбирать имена цветов (или другие имена активов), которые вы добавили в Каталог активов.
Вы можете, конечно, получить цвет / актив, если вы уже знаете имя.

Более того, каталог ресурсов компилируется в Assets.car, что невозможно прочитать, поэтому попытки прочитать этот файл также бесполезны.

В любом случае ... возвращаясь к вашему делу, вам придется вручную поддерживать какой-то механизм, например Enum, для отслеживания цветов.


Решение:

  • Добавить цвет в Каталог активов; скажем по имени "WeirdOrange"
  • Используйте Enum для сохранения имен ваших пользовательских цветов, например:

    enum Colors: String {
        //... previous cases
        case weirdOrange = "WeirdOrange" //... now we add this one
    }
    
  • Используйте его в приложении как:

    UIColor(named: Colors.weirdOrange.rawValue)
    

* 1 028 * Пример:

Позволяет немного подстроить его для вашей цели:

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
  • При добавлении / удалении соответствующего цветового актива вам придется вручную добавить / удалить регистр
0 голосов
/ 14 марта 2019

Вы можете получить цвет из актива, используя этот

let color = UIColor(named: "MyCustomColorName")

Вы можете объявить список пользовательских цветов, которые вы поддерживаете

enum CustomColors
{
   case CustomYellow
   case CustomRed
}

и в случае переключателя вы можете передать цвет из активов следующим образом:

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