如何过滤PhotoPicker/UIImagePickerController仅显示静态图片,排除视频与GIF?
如何在iOS图片选择器中排除GIF,仅显示静态图片
一、UIImagePickerController的局限性
UIImagePickerController只能通过mediaTypes按大类别过滤资源,没法直接排除同属image类型的GIF。这种方案只能在用户选择后拦截GIF,无法在选择器界面中隐藏它们。如果要实现选择器层面直接排除GIF,推荐使用iOS 14+推出的PHPickerViewController框架。
二、用PHPickerViewController实现静态图片过滤(排除GIF)
以下是完整的SwiftUI封装代码,直接在选择器中隐藏GIF:
import SwiftUI import PhotosUI struct StaticImagePickerView: UIViewControllerRepresentable { @Binding var selectedImage: UIImage? @Environment(\.dismiss) var dismiss func makeUIViewController(context: Context) -> PHPickerViewController { var configuration = PHPickerConfiguration() // 限制选择器仅显示图片类资源 configuration.filter = .images // 直接排除GIF类型,选择器中不再显示GIF configuration.excludeAssetTypes = [UTType.gif] // 可选:限制单次选择1张图片(可根据需求调整) configuration.selectionLimit = 1 let picker = PHPickerViewController(configuration: configuration) picker.delegate = context.coordinator return picker } func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {} func makeCoordinator() -> Coordinator { Coordinator(parent: self) } class Coordinator: NSObject, PHPickerViewControllerDelegate { let parent: StaticImagePickerView init(parent: StaticImagePickerView) { self.parent = parent } func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { parent.dismiss() guard let result = results.first else { return } // 加载并处理选中的静态图片 if result.itemProvider.canLoadObject(ofClass: UIImage.self) { result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in DispatchQueue.main.async { if let image = image as? UIImage { self?.parent.selectedImage = image print("选中静态图片: \(image)") } } } } } } }
关键配置说明
configuration.filter = .images:锁定选择器仅展示图片类资源,自动排除视频configuration.excludeAssetTypes = [UTType.gif]:精准排除GIF类型,从源头上隐藏这类资源- 基于
PHPickerResult的资源加载逻辑,比UIImagePickerController更灵活、更贴合现代iOS资源管理规范
三、兼容iOS 13及以下:UIImagePickerController的拦截方案
如果必须兼容iOS 13,只能在用户选择后拦截GIF,可优化判断逻辑(比后缀判断更准确):
// 在Coordinator的didFinishPickingMediaWithInfo方法中替换原GIF判断逻辑 if let selectedImageURL = info[.imageURL] as? URL { if let type = try? selectedImageURL.resourceValues(forKeys: [.typeIdentifierKey]).typeIdentifier, UTType(type) == UTType.gif { print("GIFs are not allowed.") picker.dismiss(animated: true) return } }
内容的提问来源于stack exchange,提问作者Rannem algarni
相关产品推荐
相关产品推荐

