iOS: Как добавить папку Assets в Framework и как получить к ним доступ в коде? - PullRequest
2 голосов
/ 09 февраля 2020

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

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

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

Ответы [ 3 ]

0 голосов
/ 09 февраля 2020

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

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

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

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

Секунда , Конфигурация меняет настройки сборки Bundle: Go для Настройки сборки на целевом комплекте и измените Базовый SDK на iOS.

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

Четвертый , создайте комплект: выберите свой комплект в качестве пункта назначения, выберите универсальное устройство c iOS и нажмите Command + 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.")
    }
0 голосов
/ 09 февраля 2020

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

  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
}

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

0 голосов
/ 09 февраля 2020

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

Предполагая, что 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)
    }
}

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

...