Могу ли я программно переключаться между каталогами активов? - PullRequest
3 голосов
/ 29 марта 2020

В моем приложении есть настройка, в которой вы можете выбрать «кошку» или «собаку». В зависимости от этого параметра все изображения в приложении должны быть разными: значки, фоны и т. Д. c

Я не хочу создавать отдельные розетки для всех изображений и писать код, который заменит эти изображения. Существует ли механизм, который позволил бы мне условно использовать тот или иной набор изображений, в зависимости от моей внутренней переменной.

Самое близкое к тому, что мне нужно, - iOS поддержка каталога ресурсов для Dark Appearance - все изображения (включая в моем приложении изображения, установленные через конструктор интерфейсов без розеток), магически заменяются в зависимости от внешнего вида приложения. Я хочу того же поведения, но исходя из моих внутренних настроек.

1 Ответ

0 голосов
/ 29 марта 2020

Переключение между каталогами ресурсов программным способом и без него не предусмотрено ни в iOS, ни в Xcode (по крайней мере, не так, как вы описали), поэтому необходимо использовать какой-то обходной путь. Причина в том, что все xcassets в комплекте приложений загружены, и вы можете использовать образ во время выполнения из любого из них без возможности указать ресурс. Это может быть достигнуто с помощью iOS Resources Bundle и XCAssets:

  • Создать два Resource Bundles, назовите их, как вы пошли, они будут представлять коллекцию данных для ваших состояний.
  • В к каждому из пакетов добавьте *.xcassets и присвойте изображения
  • Создайте перечисление, представляющее состояние (я) вашего приложения

`

enum AppState {

    case dog
    case cat

    var bundle: Bundle {
      switch self {
      case .dog:
        return Bundle(identifier: "com.dog")!
      case .cat:
        return Bundle(identifier: "com.cat")!
    }
}

`

И это все, вуаля. Вы можете сделать вашу жизнь проще, сделав расширение для изображения, по желанию, конечно. Я предполагаю, что вы будете использовать те же имена изображений, только состояния будут меняться.

extension UIImage {
  func getImage(named: String, state: AppState) {
    return UIImage(named: named, in: state.bundle!)
  }
}

Надеюсь, это то, что вам нужно.

...