如何从 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()?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道应用程序是不是从 SwiftUI 中的后台删除?

如何从 SwiftUI 中的函数返回按钮?

如何从 SwiftUI 中的图库中选择图像

如何从 Objective-c/Swift 中的 settings.bundle 中检索值?

如何从 SwiftUI 中的 NavigationView 中删除搜索栏?

SwiftUI:如何从核心数据中的 TextField 中保存值