繁体   English   中英

如何使用 Bundle In SwiftUI with Image

[英]How to Use Bundle In SwiftUI with Image

例如:我在项目中有 Bundle,它叫做“Game.Bundle”

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

但捆绑包不起作用。

我怎样才能使用自定义包

在此处输入图像描述

您提供的代码段似乎在self中将b作为实例和局部变量引用

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)

或者重构以消除 force unwraps ! 添加了一些问题分析。

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
}

SwiftUI Image(_, bundle: _)在相应的 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)
    }
}

您可以使用我的扩展程序:

extension Image {
    init(path: String) {
        self.init(uiImage: UIImage(named: path)!)
    }
}

在 SwiftUI:

Image(path: "Game.bundle/Giyuu.png")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM