PHPickerViewController无法加载WebP图片的解决方法咨询
解决PHPickerViewController无法加载WebP图片的问题
你的问题出在itemProvider.canLoadObject(ofClass: UIImage.self)这个判断上——对于WebP格式的图片,这个方法会返回false,导致后续的加载逻辑根本不会执行。
要解决这个问题,我们可以跳过这个判断,直接从PHPickerResult中获取图片的原始数据,再用UIImage(data:)来初始化图片(iOS 14及以上系统的UIImage已经原生支持WebP解码)。
修改后的完整代码如下:
struct ImagePicker: UIViewControllerRepresentable { @Binding var image: UIImage? func makeUIViewController(context: Context) -> PHPickerViewController { var config = PHPickerConfiguration() config.filter = .images let picker = PHPickerViewController(configuration: config) picker.delegate = context.coordinator return picker } func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {} func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, PHPickerViewControllerDelegate { let parent: ImagePicker init(_ parent: ImagePicker) { self.parent = parent } func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) guard let result = results.first else { return } let provider = result.itemProvider // 直接请求图片数据,而非依赖UIImage类型加载 provider.loadDataRepresentation(forTypeIdentifier: UTType.image.identifier) { data, error in guard let data = data, error == nil else { // 处理数据获取失败的情况 print("加载图片数据失败: \(error?.localizedDescription ?? "未知错误")") return } // 用数据初始化UIImage,支持WebP格式 DispatchQueue.main.async { self.parent.image = UIImage(data: data) } } } } }
关键修改说明:
- 替换了原有的
canLoadObject(ofClass:)判断逻辑,改用loadDataRepresentation(forTypeIdentifier:)直接获取图片的原始二进制数据 - 使用
UTType.image.identifier作为类型标识,覆盖所有图片格式(包括WebP) - 获取到数据后,在主线程更新
image绑定变量(因为闭包是在后台线程执行的) - 增加了错误处理逻辑,方便排查加载失败的情况
内容的提问来源于stack exchange,提问作者misster
相关产品推荐
相关产品推荐

