SwiftUI中不依赖UIKit通过URL或Data创建Image的方法
纯SwiftUI跨平台创建Image实例方案
不需要依赖UIKit的UIImage或者AppKit的NSImage,通过SwiftUI原生API搭配跨平台底层框架即可实现从本地URL、二进制Data创建Image实例,全平台兼容iOS、macOS、watchOS、tvOS。
方案1:从本地缓存URL直接加载(推荐)
如果图片已经通过FileManager写入本地缓存目录,优先使用SwiftUI原生提供的文件路径初始化器,系统会自动处理内存缓存、解码优化,性能最优:
// 你存在缓存目录的图片本地URL let cacheImageURL: URL = // FileManager返回的缓存图片路径 // 直接传入路径创建Image let image = Image(contentsOfFile: cacheImageURL.path)
版本提示:该API最低支持 iOS 16.0、macOS 13.0、watchOS 9.0、tvOS 16.0。注意不要传入网络URL,该方法仅支持本地文件系统路径。
方案2:从内存二进制Data加载
如果需要直接从内存中的Data字节数据创建Image,或者需要兼容更低系统版本,可以通过全平台通用的Core Graphics框架解析图片数据,再转成SwiftUI的Image,全程不需要引入UIKit/AppKit:
import CoreGraphics import SwiftUI extension Image { /// 直接从二进制Data创建跨平台Image实例 /// - Parameters: /// - data: 图片二进制数据 /// - scale: 图片缩放比例,默认1.0对应@1x图 init?(data: Data, scale: CGFloat = 1.0) { guard let imageSource = CGImageSourceCreateWithData(data as CFData, nil), let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) else { return nil } self.init(cgImage, scale: scale, label: Text("")) } } // 调用示例 let imageData: Data = // 下载得到的图片字节数据 let image = Image(data: imageData)
- 低版本系统下加载本地URL图片时,只需要先通过
Data(contentsOf:)读取本地文件的字节数据,再调用上面的扩展初始化方法即可。 - Core Graphics是苹果全平台通用的底层图形框架,不会产生平台相关的依赖,适配所有苹果系统平台。
内容的提问来源于stack exchange,提问作者NoKey
相关产品推荐
相关产品推荐

