iOS: как добавить папку Assets в Framework и как получить к ним доступ в коде?

Я создал приложение для iOS и добавил к нему фреймворк. Сгенерированная структура не имеет папки с ресурсами, как, например, приложение для создания Single View App . Поэтому я создал папку Assets внутри папки framework и перетащил ее в xcode, выбрав цель в качестве моей рамки.

Я попытался использовать актив, но актив не появляется. Может показать один, покажи мне, как правильно это сделать? Можно ли создать папку активов в рамках?

Я очень новичок в iOS, поэтому любые рекомендации будут высоко оценены. Заранее спасибо.

Всего 3 ответа


Добавьте каталог активов в целевую среду фреймворка, как обычно, через Новый файл ...> Ресурсы , но для получения ресурса из такого актива необходимо явно указать пакет, как в следующем примере ...

Предполагая, что ImageProvider находится в целевой структуре, код может быть

public class ImageProvider {
    // convenient for specific image
    public static func picture() -> UIImage {
        return UIImage(named: "picture", in: Bundle(for: self), with: nil) ?? UIImage()
    }

    // for any image located in bundle where this class has built
    public static func image(named: String) -> UIImage? {
        return UIImage(named: named, in: Bundle(for: self), with: nil)
    }
}

конечно, вы можете назвать такой класс в любом случае.


Вот как я это делаю.

Прежде всего , вот как вы можете создать Bundle для хранения ваших активов, таких как изображения.

Сначала создайте новую цель: перейдите в главное меню Xcode, File => New => Target. Выберите «вкладку macOS», затем из «Framework & Library» выберите «Bundle».

Дайте ему желаемое имя и нажмите Finish. Вы должны увидеть пакет в папке вашего проекта.

Во-вторых , изменения конфигурации в настройках сборки Bundle. Перейдите в «Настройки сборки» на целевом комплекте и измените базовый SDK на iOS.

В-третьих , добавление изображений: добавляйте свои изображения непосредственно в Bundle, не нужно добавлять папку ресурсов. Просто перетащите.

В-четвертых , создайте пакет: выберите свой пакет как пункт назначения, выберите универсальное устройство iOS и нажмите Ctrl + B

В-пятых , .bundle появится в папке ваших продуктов в папке вашего проекта. Щелкните правой кнопкой мыши на нем и просмотрите его в Finder, а затем перетащите его в основную папку вашего проекта.

Наконец , вот как я могу получить доступ к ресурсам внутри вашего пакета.

// Empty UIImage array to store the images in it.
var images = [UIImage]()

let fileManager = FileManager.default
let bundleURL = Bundle.main.bundleURL
let assetURL = bundleURL.appendingPathComponent("MyBundle.bundle") // Bundle URL
do {
  let contents = try fileManager.contentsOfDirectory(at: assetURL,
 includingPropertiesForKeys: [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey],
 options: .skipsHiddenFiles)
  for item in contents { // item is the URL of everything in MyBundle imgs or otherwise.

      let image = UIImage(contentsOfFile: item.path) // Initializing an image
      images.append(image!) // Adding the image to the icons array
  }
}
catch let error as NSError {
  print(error)
}

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

Вот как я справился с этим очень тривиально.

    let fileManager = FileManager.default
    let bundleURL = Bundle.main.bundleURL
    let assetURL = bundleURL.appendingPathComponent("Glyphs.bundle")
    do {
      let contents = try fileManager.contentsOfDirectory(at: assetURL, includingPropertiesForKeys: [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey], options: .skipsHiddenFiles)
      for item in contents {
        let imageName = item.lastPathComponent
        if imageName != "Info.plist" {
          let image = UIImage(contentsOfFile: item.path)
          icons.append(image!)
        }
      }
    }
    catch {
      //print(error)
      showAlert(withTitle: "Error", message: "Can't get the icons.")
    }

У меня такая же проблема. сценарий:

  1. наш фреймворк будет потребляться iOS / OSX
  2. много PNG внутри Framework
  3. мы хотим pngs в iOSApp && MacOs
  4. давайте предположим, что наш фреймворковый проект и цель - «MyCustomFramework.framework» (обычная желтая иконка ..) уже в нашем приложении

-

func filePathInFrameworkBundle(name: String)->String{

    let myBundlePath  = Bundle.main.bundlePath

    #if  os(iOS)

    let inMyFW = myBundlePath +
        "/Frameworks" +
    "/MyCustomFramework.framework"

    #elseif os(OSX)
    let inMyFW = myBundlePath +
        "/Contents/Frameworks" +
        "/MyCustomFramework.framework" + "/Versions/A/Resources"

    #else
    #endif

    let pathInBundle = inMyFW+"/"+name
    return pathInBundle
}

Теперь Вы можете использовать ЭТОТ путь в обычных вызовах загрузки изображений.


Есть идеи?

10000