ToB企服应用市场:ToB评测及商务社交产业平台

标题: iOS 系统提供的媒体资源选择器(PHPickerViewController) [打印本页]

作者: 万万哇    时间: 2024-9-18 22:21
标题: iOS 系统提供的媒体资源选择器(PHPickerViewController)
简介

在前面的博客中我们已经介绍了一个系统为我们提供的媒体选择器UIImagePickerController,它的功能很强大,但是唯一的不敷就是只能选取单个媒体资源,而PHPickerViewController恰好弥补了这一空缺。
PHPickerViewController是iOS 14及更高版本中引入的一个现代化媒体选择器,旨在更换UIImagePickerController。它不但提供了更机动的媒体选择功能,还拥有更现代的用户界面。PHPickerViewController允许用户在一次选择操纵中选择多个图片和视频,并且可以对选择的媒体范例举行更加过细的控制,例如仅选择图片、视频或Live Photos等。此外,PHPickerViewController不再需要用户授予应用完备的照片库访问权限,只需有限的选择访问权限,从而提高了用户隐私。
在本篇博客中,我们将详细介绍怎样利用PHPickerViewController来实现多媒体选择功能,并展示其在实际应用中的优势和利用场景。
基本用法


  1. import PhotosUI
复制代码

  1. var configuration = PHPickerConfiguration()
  2. configuration.selectionLimit = 9 // 可选项,限制选择的媒体数量
  3. configuration.filter = .images // 过滤选项,可以选择.images, .videos, 或 .any
  4. let picker = PHPickerViewController(configuration: configuration)
  5. picker.delegate = self
  6. present(picker, animated: true, completion: nil)
复制代码

  1. extension YourViewController: PHPickerViewControllerDelegate {
  2.     func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
  3.         picker.dismiss(animated: true, completion: nil)
  4.         for result in results {
  5.             result.itemProvider.loadObject(ofClass: UIImage.self) { (object, error) in
  6.                 if let image = object as? UIImage {
  7.                     DispatchQueue.main.async {
  8.                         // 使用选择的图像
  9.                     }
  10.                 }
  11.             }
  12.         }
  13.     }
  14. }
复制代码
进阶配置

PHPickerViewController自己并没有提供什么配置的接口大概是属性,因为它的配置信息全都交给了configuration属性。
PHPickerConfiguration主要用于定制媒体选择器的举动和外观,下面我逐个来介绍一下:

  1. configuration.selectionLimit = 5 // 允许选择最多5个媒体
复制代码

  1. configuration.filter = .images // 只允许选择图片
  2. configuration.filter = .any // 允许选择图片和视频
复制代码

  1. configuration.preferredAssetRepresentationMode = .automatic
复制代码

  1. // 设置之前选中的标识符
  2.         if #available(iOS 15.0, *) {
  3.             configuration.preselectedAssetIdentifiers = previouslySelectedIdentifiers
  4.         }
复制代码

  1. configuration.photoLibrary = PHPhotoLibrary.shared()
复制代码

  1. configuration.selection = .ordered // 选中的媒体按顺序排列
复制代码
利用示例



对于上面的场景,如果需要一次性选择多张照片(最多可选9张),利用PHPickerViewController黑白常符合的选择。
起首我们来设置一些基本属性,比如可选资源最大个数,已选资源列表等等:
  1.     /// 最大数量
  2.     private let maxCount = 9
  3.     /// 已选结果
  4.     private var selectedResults = [PHAlbumModel]()
复制代码
其中PHAblbuModel是我们自定义数据模子,我们只需要图片资源和资源标识这两个数据,代码如下:
  1. class PHAlbumModel: NSObject {
  2.     /// 图片
  3.     var image:UIImage?
  4.     /// 标识
  5.     var identifier:String?
  6. }
复制代码

接下来我们来实现列表中的第一个元素的事件,体现多媒体资源选择视图控制器,代码如下:
  1.     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  2.         if indexPath.row == 0 {
  3.             // 选择图片
  4.             showAlbum()
  5.         }
  6.     }
复制代码
  1.     @objc func showAlbum() {
  2.         if self.selectedResults.count >= maxCount {
  3.             print("已经达到最大选择数量")
  4.             return
  5.         }
  6.         var configuration = PHPickerConfiguration()
  7.         // 资源类型
  8.         configuration.filter = .images
  9.         // 最大数量
  10.         configuration.selectionLimit = maxCount - self.selectedResults.count + 1
  11.         configuration.selection = .ordered
  12.         // 预选资源
  13.         var preselectedAssetIdentifiers = [String]()
  14.         for model in selectedResults {
  15.             if let identifier = model.identifier , identifier != "" {
  16.                 preselectedAssetIdentifiers.append(identifier)
  17.             }
  18.         }
  19.         configuration.preselectedAssetIdentifiers = preselectedAssetIdentifiers
  20.         let mediaPikcerViewController = PHPickerViewController(configuration: configuration)
  21.         mediaPikcerViewController.delegate = self
  22.         present(mediaPikcerViewController, animated: true, completion: nil)
  23.         
  24.     }
复制代码
在上面的代码中:
我们过滤了资源的范例,只需要图片范例的媒体资源。
设置了资源的最大数量为,为最大数量减去已经选择的媒体数量。
设置了选中资源的体现顺序。
并且也设置了我们当前已经选择的媒体资源。
接下来来看一下代理方法的实现:
  1.     func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
  2.         picker.dismiss(animated: true, completion: nil)
  3.         for result in results {
  4.             let itemProvider = result.itemProvider
  5.             if itemProvider.canLoadObject(ofClass: UIImage.self) {
  6.                 itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
  7.                     if let image = image as? UIImage {
  8.                         let model = PHAlbumModel()
  9.                         print("获取到图片 \(result.assetIdentifier)")
  10.                         model.image = image
  11.                         model.identifier = result.assetIdentifier
  12.                         self?.selectedResults.append(model)
  13.                         DispatchQueue.main.async {
  14.                             self?.collectionView.reloadData()
  15.                         }
  16.                     }
  17.                 }
  18.             }
  19.         }
  20.     }
复制代码
获取到媒体资源之后,根据所需数据构建了我们自己的数据模子,并且添加到了已选择资源的列表中,回到主线程举行刷线列表。

结语

在本文中,我们详细探讨了 PHPickerViewController,一个用于选择照片和视频的强大工具。通过比较它与 UIImagePickerController 的差别,我们看到了 PHPickerViewController 的优势,特别是在支持多选和机动配置方面。
PHPickerViewController 不但简化了用户选择媒体的过程,还提供了更好的用户体验。尽管它不支持拍照或录像功能,但其多选能力和对差别媒体范例的支持,使其在许多应用场景中成为理想选择。通过符合的配置和管理选项,你可以充分利用这个工具,提升应用的功能和用户体验。
盼望这篇文章能帮助你更好地明确和应用 PHPickerViewController。如有任何疑问或需要进一步讨论,请随时与我接洽。感谢你的阅读和支持!







免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4