如何从 SwiftUI 中的 Bundle 中的有效路径或 URL 将图像加载到 Image()?
Posted
技术标签:
【中文标题】如何从 SwiftUI 中的 Bundle 中的有效路径或 URL 将图像加载到 Image()?【英文标题】:How can I load an Image to Image() from a valid path or URL from Bundle in SwiftUI? 【发布时间】:2021-02-09 11:06:21 【问题描述】:我的 Bundle.main 中有一个 PNG 文件,我想使用该 URL 或路径在 SwiftUI 中提供我的图像,现在我正在使用这个向下代码,但我喜欢只使用 SwiftUI 而不是 UIKit 混合
Image(uiImage: UIImage(contentsOfFile: path)!)
对于接受路径或 URL 的 Image,我们有一些初始化方法吗?
【问题讨论】:
【参考方案1】:如果您想从文件路径初始化,您可以在 Image 上创建一个扩展来为您处理样板代码。但是,如果 UIImage 不存在,您需要处理这种情况,因为 Image(uiImage:)
需要一个非可选的 UIImage 作为参数。
这样的事情应该可以工作:
extension Image
init(contentsOfFile: String)
// You could force unwrap here if you are 100% sure the image exists
// but it is better to handle it gracefully
if let image = UIImage(contentsOfFile: contentsOfFile)
self.init(uiImage: image)
else
// You need to handle the option if the image doesn't exist at the file path
// let's just initialize with a SF Symbol as that will exist
// you could pass a default name or otherwise if you like
self.init(systemName: "xmark.octagon")
然后你会像这样使用它:
Image(contentsOfFile: "path/to/image/here")
或者您可以使用 UIImage
的属性从包中加载
extension Image
init(uiImageNamed: String)
if let image = UIImage(named: uiImageNamed, in: .main, compatibleWith: nil)
self.init(uiImage: image)
else
// You need to handle the option if the image doesn't exist at the file path
self.init(systemName: "xmark.octagon")
然后你会像这样使用它:
Image(uiImageNamed: "ImageName")
【讨论】:
我有一种你的扩展作为功能形式,它做同样的事情,我很感兴趣捆绑,你在编辑你的答案之前维护,我试过这段代码,但它不起作用,我在这里做错了什么? Image("myImageName", bundle: Bundle(url: Bundle.main.url(forResource: "myImageName", withExtension: "png")!)) 我删除的代码不起作用,这就是我删除它的原因。Image
似乎只在资产目录中查找,而UIImage
在捆绑包和资产目录中查找。所以你不能初始化你在那里尝试的方式。另外,您正在做的事情似乎是写Bundle.main
的迂回方式
我也注意到了你刚才所说的,你认为这是一个错误,它进入资产目录进行搜索?并且不想给定Bundle?
因为苹果说: 参数: name:要查找的图像资源的名称,以及用于标记图像的本地化键。 bundle:用于搜索图像资源和本地化内容的包。如果nil
,则使用主Bundle
。默认为nil
。
这可能是一个错误,也可能是 Apple 期望所有图像都应包含在资产目录中。以上是关于如何从 SwiftUI 中的 Bundle 中的有效路径或 URL 将图像加载到 Image()?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Objective-c/Swift 中的 settings.bundle 中检索值?