简介:本文深度解析Swift照片/视频选择器的实现原理,结合iOS原生API与最佳实践,提供从权限管理到UI定制的全流程解决方案。
Swift照片/视频选择器是iOS开发中高频需求模块,其核心功能包括:多媒体资源访问、权限控制、UI展示与用户交互。基于iOS系统特性,开发者需重点处理PHPhotoLibrary框架的权限管理机制。
iOS14+系统对隐私保护提出更高要求,开发者必须实现动态权限申请流程:
import Photosfunc checkPhotoAuthorization() {let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)switch status {case .notDetermined:PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in// 处理授权结果}case .restricted, .denied:// 引导用户开启权限case .authorized, .limited:// 执行媒体选择逻辑@unknown default:break}}
建议采用渐进式权限申请策略:首次仅请求读取权限,待用户交互后再申请写入权限。
推荐采用MVC架构实现:
let options = PHImageRequestOptions()options.isSynchronous = falseoptions.deliveryMode = .highQualityFormatPHImageManager.default().requestImage(for: asset,targetSize: CGSize(width: 300, height: 300),contentMode: .aspectFill,options: options) { image, _ in// 处理获取的图片}
关键参数说明:
视频选择需额外处理:
let assetResources = PHAssetResource.assetResources(for: videoAsset)guard let firstResource = assetResources.first else { return }let options = PHVideoRequestOptions()options.version = .originalPHImageManager.default().requestAVAsset(forVideo: videoAsset,options: options) { avAsset, _, _ inif let urlAsset = avAsset as? AVURLAsset {// 获取视频URL}}
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {if indexPath.row == dataSource.count - 5 { // 提前5个加载loadNextPage()}}
PHCachingImageManager.stopCachingImages推荐使用DispatchQueue实现:
let imageQueue = DispatchQueue(label: "com.example.imageProcessing", qos: .userInitiated)imageQueue.async {// 图片处理逻辑DispatchQueue.main.async {// 更新UI}}
通过继承UICollectionView实现:
class MediaGridCell: UICollectionViewCell {let imageView = UIImageView()let selectionIndicator = UIView()override init(frame: CGRect) {super.init(frame: frame)setupViews()}func configure(with asset: PHAsset, isSelected: Bool) {// 配置单元格内容}}
实现自定义预览界面:
class MediaPreviewController: UIViewController {var asset: PHAsset!override func viewDidLoad() {super.viewDidLoad()setupScrollView()loadAsset()}private func loadAsset() {let options = PHImageRequestOptions()// 配置请求选项PHImageManager.default().requestImage(for: asset, ...) { [weak self] image, _ inself?.imageView.image = image}}}
class MediaPicker: NSObject {private var selectedAssets = [PHAsset]()private let imageManager = PHCachingImageManager()func presentPicker(from viewController: UIViewController) {let picker = UIImagePickerController()picker.sourceType = .photoLibrarypicker.delegate = selfviewController.present(picker, animated: true)}// 实现UIImagePickerControllerDelegate}
class AdvancedMediaPicker: UIViewController {private var assets: [PHAsset] = []private var collectionView: UICollectionView!override func viewDidLoad() {super.viewDidLoad()setupCollectionView()fetchAssets()}private func fetchAssets() {let options = PHFetchOptions()options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]let fetchResult = PHAsset.fetchAssets(with: .image, options: options)// 处理获取结果}}
动态权限提示:在Info.plist中添加:
<key>NSPhotoLibraryAddUsageDescription</key><string>需要相册权限以保存照片</string><key>NSPhotoLibraryUsageDescription</key><string>需要访问相册以选择照片</string>
权限状态监控:
NotificationCenter.default.addObserver(forName: PHPhotoLibrary.authorizationStatusDidChangeNotification,object: nil,queue: .main) { _ in// 响应权限变更}
PHImageRequestOptions.isSynchronous = falsePHImageRequestOptions.isNetworkAccessAllowed本文提供的解决方案已在多个商业项目中验证,开发者可根据实际需求调整实现细节。建议定期检查Apple开发者文档更新,确保符合最新系统要求。