简介:本文详细介绍Swift照片/视频选择器的实现方案,涵盖系统API调用、权限管理、界面定制及性能优化,提供完整代码示例与实用建议。
在iOS应用开发中,媒体资源选择功能是社交、电商、教育等领域的核心需求。Swift语言凭借其类型安全、高性能和现代语法特性,成为实现照片/视频选择器的理想选择。本文将从系统API调用、权限管理、界面定制、性能优化四个维度,结合实际开发经验,系统阐述如何构建一个高效、易用的Swift照片/视频选择器。
iOS系统提供了两种主流的媒体选择API:PHPickerConfiguration(iOS 14+)和UIImagePickerController。前者作为苹果推荐的现代方案,具有显著优势:
import PhotosUIvar config = PHPickerConfiguration(photoLibrary: .shared())config.selectionLimit = 10 // 限制选择数量config.filter = .images // 仅显示图片(可选.videos、.any)config.preferredAssetRepresentationMode = .current // 优先使用原始分辨率let picker = PHPickerViewController(configuration: config)picker.delegate = selfpresent(picker, animated: true)
尽管PHPicker是推荐方案,但在以下情况仍需使用UIImagePicker:
let picker = UIImagePickerController()picker.sourceType = .photoLibrarypicker.mediaTypes = ["public.image", "public.movie"] // 同时支持图片和视频picker.delegate = selfpresent(picker, animated: true)
媒体资源访问涉及隐私权限,需严格遵循苹果规范:
<key>NSPhotoLibraryUsageDescription</key><string>需要访问相册以选择照片和视频</string><key>NSCameraUsageDescription</key><string>需要相机权限以拍摄新照片</string>
func checkPhotoLibraryAuthorization() {let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)switch status {case .notDetermined:PHPhotoLibrary.requestAuthorization(for: .readWrite) { newStatus in// 处理授权结果}case .restricted, .denied:showPermissionAlert()case .authorized, .limited:presentPhotoPicker()@unknown default:break}}
通过PHPickerDelegate实现结果处理:
extension ViewController: PHPickerViewControllerDelegate {func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {picker.dismiss(animated: true)let itemProviders = results.compactMap { $0.itemProvider }for provider in itemProviders {if provider.canLoadObject(ofClass: UIImage.self) {provider.loadObject(ofClass: UIImage.self) { image, _ in// 处理图片}} else if provider.canLoadObject(ofClass: PHAsset.self) {// 处理视频或其他资源}}}}
func fetchVideos(durationLimit: TimeInterval) -> PHFetchResult<PHAsset> {let options = PHFetchOptions()options.predicate = NSPredicate(format: "mediaType == %d AND duration <= %f",PHAssetMediaType.video.rawValue,durationLimit)return PHAsset.fetchAssets(with: options)}
// 使用PHAssetCollection创建临时相册PHPhotoLibrary.shared().performChanges({PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: "临时选择")}) { success, error in// 处理创建结果}
// 检测设备类型优化界面布局let isPad = UIDevice.current.userInterfaceIdiom == .padlet columnCount = isPad ? 5 : 3let itemSize = CGSize(width: 100, height: 100)
实施以下监控确保选择器流畅运行:
随着iOS系统更新,照片选择器可考虑集成:
构建Swift照片/视频选择器需综合考虑系统兼容性、用户体验和性能优化。推荐采用PHPicker作为首选方案,配合严谨的权限管理和界面定制。对于复杂需求,可封装成独立模块,通过协议暴露必要接口。实际开发中,建议先实现基础功能,再逐步添加高级特性,通过迭代优化提升稳定性。
附:完整实现示例项目结构
MediaPicker/├── Core/│ ├── PickerCoordinator.swift│ └── MediaProcessor.swift├── UI/│ ├── PickerViewController.swift│ └── AssetCollectionCell.swift├── Utilities/│ ├── PermissionManager.swift│ └── PerformanceMonitor.swift└── Resources/└── Info.plist
通过模块化设计,可显著提升代码可维护性,为后续功能扩展奠定基础。