PhotoKit相关API详解,iOS自定义相册

最近做了一个自定义相册,用到了PHotoKit的相关API,做一下备忘


基于PhotoKit,iOS8及以后支持
PhotoKit组成介绍

PhotoKit通过两个类来管理资源

  • PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格request相关api默认异步,如需同步,需设置synchronous
  •  PHPhotoLibrary:用于处理权限管理,资源的保存,调用performChanges方法,在changeblock中根据资源构建个 PHAssetChangeRequest 来存入

 

获取相册以及asset

PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源。
PHFetchOptions: 获取资源时的参数,可以进行过滤和排序。可以传 nil,即使用系统默认值。
PHFetchResult: 表示一系列的资源集合,也可以是相册的集合。
PHAssetCollection: 表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等)
PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数

enum PHAssetCollectionType : Int {
    case Album //从 iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册
    case SmartAlbum //经由相机得来的相册
    case Moment //Photos 为我们自动生成的时间分组的相册
}

enum PHAssetCollectionSubtype : Int {
    case AlbumRegular //用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
    case AlbumSyncedEvent //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
    case AlbumSyncedFaces //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
    case AlbumSyncedAlbum //做了 AlbumSyncedEvent 应该做的事
    case AlbumImported //从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
    case AlbumMyPhotoStream //用户的 iCloud 照片流
    case AlbumCloudShared //用户使用 iCloud 共享的相册
    case SmartAlbumGeneric //文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
    case SmartAlbumPanoramas //相机拍摄的全景照片
    case SmartAlbumVideos //相机拍摄的视频
    case SmartAlbumFavorites //收藏文件夹
    case SmartAlbumTimelapses //延时视频文件夹,同时也会出现在视频文件夹中
    case SmartAlbumAllHidden //包含隐藏照片或视频的文件夹
    case SmartAlbumRecentlyAdded //相机近期拍摄的照片或视频
    case SmartAlbumBursts //连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
    case SmartAlbumSlomoVideos //Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
    case SmartAlbumUserLibrary //这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
    case Any //包含所有类型
}

 

根据asset获取图片或视频

  • requestImageForAsset: targetSize:适用于有size的图片请求。例如:列表加载,预览
  • requestImageDataForAsset:适用于没有size的图片请求。例如:原图
  • 视频。。。

 

保存图片或视频

 PHPhotoLibrary:用于处理资源的存入,权限管理,调用performChanges方法,在changeblock中根据资源构建个 PHAssetChangeRequest 来存入

  • authorizationStatus

  • requestAuthorization

  • 向相册中存图片

  •     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
            localIdentifier = request.placeholderForCreatedAsset.localIdentifier;
            if (location) {
                request.location = location;
            }
            request.creationDate = [NSDate date];
        } completionHandler:^(BOOL success, NSError *error) {
            
        }];

     

 

PHImageRequestOptions:

几个属性控制了API的调用效果

  • version:表示当前请求资源的版本:current:是否编辑,获取当前版本;unadjusted:不带调节的原始版本;original:原始版本,组合格式下的高保真格式
  • deliveryMode:投递方式:Opportunistic:在异步情况下会返回多个结果,同步情况下返回一个;HighQualityFormat:一个结果,高质量格式;FastFormat:一个结果,降级
  • resizeMode:调整大小模式:none:不调整;fast:使用 targetSize 作为最佳解码的提示,当源图像是压缩格式(即子采样)时,交付的图像可能大于 targetSize;exact:与上述相同,但也保证交付的图像与目标大小完全相同(必须在指定规范化裁剪时进行设置);
  • networkAccessAllowed:如有必要,将从iCloud下载图像(客户端可以使用进度处理程序监视或取消)。默认为 NO。如果为YES,并且请求的图像未存储在本地设备上,则"PhotoKit"会从 iCloud 下载图像。若要收到有关下载进度的通知,请使用 progressHandler 属性提供"PhotoKit"在下载图像时定期调用的代码块。如果 NO(默认值),并且图像不在本地设备上,则结果处理程序的 info 字典中的 PHImageResultIsInCloudKey 值指示除非启用网络访问,否则图像不可用。

  • synchronous:默认为no,同步请求资源,一般仅用于后台线程执行同步请求。如果为NO, requestImageForAsset:targetSize:contentMode:options:resultHandler: 方法会马上返回,PhotoKit会根据deliverymode属性来调用结果block。如果为YES,requestImageForAsset:targetSize:contentMode:options:resultHandler:方法会阻塞调用线程,直到图片数据请求完成或错误发生

  • progressHandler:默认为nil,如果您请求的图像的数据不在本地设备上,并且您已启用使用 networkAccessAllowed 属性进行下载,则"PhotoKit"会定期调用您的块以报告进度并允许您取消下载。

  • normalizedCropRect:用于获取裁剪图片。要请求裁剪图像,请在相对于图像的单位座标空间中指定裁剪矩形。在此座标系中,点 {0.0,0.0} 表示图像的左上角,点 {1.0,1.0} 表示相对的角,此属性默认为 CGRectZero,不进行裁剪。如果指定裁剪矩形,则还必须为 resizeMode 属性指定 PHImageRequestOptionsResizeModeExact 选项。


总结:

  • 在列表加载图片或进行大图预览时,使用requestImageForAsset:targetSize:contentMode:options:resultHandler:,亲测即便是请求不在本地iCloud图片也非常快,预览图
  • 当用户选中图片,设置networkAccessAllowed为YES,加载iCloud图片,可以根据progressHandler获取进度
  • 当需要使用高质量图片时,根据实际情况设置deliveryMode

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章