[英]How to Use Bundle In SwiftUI with Image
您提供的代码段似乎在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.