Cómo usar el paquete en SwiftUI con imagen

Aug 18 2020

Por ejemplo: tengo Bundle en proyecto, se llama "Game.Bundle"

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

pero el paquete no funciona.

¿Cómo puedo usar un paquete personalizado?

Respuestas

1 Asperi Aug 18 2020 at 23:09

SwiftUI Image(_ , bundle: _)busca un recurso de imagen en el catálogo de activos del paquete correspondiente. En su caso, la imagen está incrustada como un archivo normal, por lo que debe buscarla y cargarla como archivo. Imageen sí mismo no puede hacer eso, por lo que debe construirse con UIImageesa posibilidad.

Entonces, suponiendo que Game.bundleesté en PlugInsla subcarpeta del paquete principal (si no, simplemente corrija la construcción de la ruta correspondiente a continuación), aquí hay un enfoque posible.

Probado con 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

Su fragmento, tal como se proporciona, parece hacer referencia btanto a selfuna instancia como a una variable local

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

¿Querías?

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

O refactorizado para eliminar los desenvolvimientos forzados !con algún análisis de problemas agregado.

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
}