Como usar o pacote no SwiftUI com imagem

Aug 18 2020

Por exemplo: eu tenho Bundle no projeto, chama-se "Game.Bundle"

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

mas Bundle não funciona.

como posso usar o pacote personalizado

Respostas

1 Asperi Aug 18 2020 at 23:09

O SwiftUI Image(_ , bundle: _)procura o recurso de imagem no catálogo de ativos do pacote correspondente. No seu caso, a imagem é apenas incorporada como arquivo normal, portanto, você deve localizá-la e carregá-la como arquivo. Imageela mesma não pode fazer isso, então ela deve ser construída com UIImageessa possibilidade.

Portanto, supondo que você Game.bundleesteja na PlugInssubpasta do pacote principal (se não - apenas corrija a construção do caminho correspondente abaixo), aqui é uma abordagem possível.

Testado com 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

Seu snippet conforme fornecido parece referenciar btanto selfuma instância quanto uma variável local

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

você queria?

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

Ou refatorado para eliminar desdobramentos de força !com alguma análise de problema adicionada.

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
}