Aa5606e32ff02b781cd09d8c2fb274ec
WWDC20 10652 - 认识新的照片选择器

本篇梳理基于:Meet the new Photos picker

在今年的WWDC中,PhotoKit有了新变化,其中一个就是PHPicker

什么是 PHPicker

PHPicker 是由系统提供的选择器,可以访问用户相册里的照片和视频。它内置了搜索功能,支持网格中的流体缩放,以及经常会被用到的照片多选功能。

简而言之,PHPicker是应用程序从相册中获取照片和视频数据的最佳方式。它有一个全新的设计,易于使用的新API,支持多选功能,同时应用程序可以指定可选择的类型。

另一个非常重要的特性是PHPicker的隐私方面。默认情况下,它有内置的隐私。

  • 不需要直接访问用户相册
  • 不会提示访问相册
  • 仅为用户提供可选择的照片和视频

这是如何做到的?

PHPicker运行在应用程序的进程之外,尽管它看起来像是在应用程序内部运行。它实际上是在一个独立的进程中运行,而不是在它上面呈现的宿主应用。但是该应用不能直接访问选择器,甚至不能截屏选择器内容。只有用户实际选择的内容才会传递回主机应用程序。

New API

1.声明一个PHPickerConfigurationPHPickerConfiguration有两个可选属性 selectionLimitfilterselectionLimit 默认值为 1,表示单选。若要多选,则设置为 0;filter 指定相册显示类型,可单独设置,也可用数组形式显示多种类型。

2.初始化PHPickerViewController,设置代理。

3.实现代理方法。

这里要注意的是,在代理方法中,首先要 dismiss掉选择器。选择完毕后我们拿到的 results打印结果如下,拿到数据后我们要先判断itemProvider是否可加载为想要的对象类型,再处理后续逻辑。另外itemProvider.loadObject是一个异步的方法,若出现错误也需要处理。

代码展示import PhotoUI

  • 单选(直接在首页展示选中的图片)
@IBAction func pickerImageAct(_ sender: Any) {
        var config = PHPickerConfiguration()
        config.filter = .images
        config.selectionLimit = 1
        let picker = PHPickerViewController(configuration: config)
        picker.delegate = self
        present(picker, animated: true)
}

```
extension ViewController: PHPickerViewControllerDelegate {
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
dismiss(animated: true, completion: nil)
if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
let previousImg = imgView.image
itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
DispatchQueue.main.async {
guard let self = self, let image = image as? UIImage, self.imgView.image == previousImg else {return}
self.imgView.image = image
}
}
}

top Created with Sketch.