Как использовать пакет в SwiftUI с изображением

Aug 18 2020

Например: у меня в проекте есть Bundle, он называется Game.Bundle.

let b :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
Image("Giyuu",bundle:self.b)

но Bundle не работает.

как я могу использовать собственный пакет

Ответы

1 Asperi Aug 18 2020 at 23:09

SwiftUI Image(_ , bundle: _)ищет ресурс изображения в каталоге Assets соответствующего пакета. В вашем случае изображение просто встроено как обычный файл, поэтому вам нужно найти и загрузить его как файл. Imageсам не может этого сделать, поэтому он должен быть построен с тем, UIImageчтобы иметь такую ​​возможность.

Итак, предполагая, что вы находитесь Game.bundleв PlugInsподпапке основного пакета (если нет - просто исправьте соответствующую конструкцию пути ниже), вот возможный подход.

Протестировано с Xcode 12 / iOS 14

struct ContentView: View {
    var body: some View {
        Image(uiImage: gameImage(name: "test") ?? UIImage())
    }

    func gameImage(name: String, type: String = "png") -> UIImage? {
        guard let plugins = Bundle.main.builtInPlugInsPath,
              let bundle = Bundle(url: URL(fileURLWithPath:
                           plugins).appendingPathComponent("Game.bundle")),
              let path = bundle.path(forResource: name, ofType: type)
              else { return nil }
        return UIImage(contentsOfFile: path)
    }
}
1 WarrenBurton Aug 18 2020 at 22:42

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

let b :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
Image("Giyuu",bundle:self.b)

Ты хотел?

let bundle :Bundle = Bundle.init(path: Bundle.main.path(forResource:"Game", ofType:"bundle")!)!
let image = Image("Giyuu",bundle:bundle)

Или проведен рефакторинг для устранения принудительных развертываний !с добавлением анализа проблем.

func getGiyuuImage() -> Image {
    guard let path = Bundle.main.path(forResource:"Game", ofType:"bundle"), let bundle = Bundle(path: path) else {
        fatalError("dev error - no Game bundle")
    }
    let image = Image("Giyuu",bundle: bundle)
    return image
}