Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Use Bundle In SwiftUI with Image

Tags:

ios

swift

swiftui

For example: i have Bundle in project , it is call "Game.Bundle"

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

but Bundle not work .

how can i use custom Bundle

enter image description here

like image 504
Itou Kaiji Avatar asked Oct 15 '25 13:10

Itou Kaiji


2 Answers

The SwiftUI Image(_ , bundle: _) looks for image resource in corresponding bundle's Assets catalog. In your case the image is just embedded as regular file, so you have to find and load it as file. Image itself cannot do that, so it should be constructed with UIImage that has such possibility.

So, assuming you Game.bundle is in PlugIns subfolder of main bundle (if not - just correct corresponding path construction below) here is possible approach.

Tested with 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)
    }
}
like image 189
Asperi Avatar answered Oct 17 '25 08:10

Asperi


Your snippet as provided seems to reference b both in self as an instance and as a local variable

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

Did you want?

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

Or refactored to eliminate force unwraps ! with some problem analysis added.

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
}
like image 40
Warren Burton Avatar answered Oct 17 '25 08:10

Warren Burton