利用Photos 框架搭建美图秀秀相册选择器

作者: 不睡觉的鸟 | 来源:发表于2016-07-23 15:48 被阅读422次

    简介:Photos框架是iOS8.0后推出的一个新的用于对系统相册进行相关操作的,在iOS8.0之前,开发中只能使用AssetsLibrary框架来访问移动设备的图片库。本文中不再对AssetsLibrary做过多的介绍,仅针对Photos框架进行详细介绍。并且以美图秀秀的照片选择器作为实例载体进行功能实现。

    首先要获取系统的所有相册,有多个方法可以选择

    1.该方法通过唯一标识符identifiers来获取相册  PHFetchOptions为将要获取到了相册的相关属性对象

    + (PHFetchResult *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray *)identifiers options:(nullable PHFetchOptions *)options;

    2.该方法通过PHAssetCollectionType 相册分类枚举值获取相关相册 PHAssetCollectionSubtype 为子类型 即进一步想相册分类  如Album和 AlbumCoundShared组合表示从iTunes同步来的 并且是从icloud分享来的相册

    + (PHFetchResult *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;

    相关枚举值如下

    typedef NS_ENUM(NSInteger, PHAssetCollectionType) {

    PHAssetCollectionTypeAlbum= 1, //从iTunes同步而来的及用户自建的相册

    PHAssetCollectionTypeSmartAlbum = 2,//相机拍摄而成的相册

    PHAssetCollectionTypeMoment= 3,//Photos为我们自动生成的时间分组相册

    }

    enumPHAssetCollectionSubtype : Int {

    caseAlbumRegular//用户在 Photos 中创建的相册,也就是我所谓的逻辑相册

    caseAlbumSyncedEvent//使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。

    caseAlbumSyncedFaces//使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。

    caseAlbumSyncedAlbum//做了 AlbumSyncedEvent 应该做的事

    caseAlbumImported//从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。

    caseAlbumMyPhotoStream//用户的 iCloud 照片流

    caseAlbumCloudShared//用户使用 iCloud 共享的相册

    caseSmartAlbumGeneric//文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。

    caseSmartAlbumPanoramas//相机拍摄的全景照片

    caseSmartAlbumVideos//相机拍摄的视频

    caseSmartAlbumFavorites//收藏文件夹

    caseSmartAlbumTimelapses//延时视频文件夹,同时也会出现在视频文件夹中

    caseSmartAlbumAllHidden//包含隐藏照片或视频的文件夹

    caseSmartAlbumRecentlyAdded//相机近期拍摄的照片或视频

    caseSmartAlbumBursts//连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。

    caseSmartAlbumSlomoVideos//Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。

    caseSmartAlbumUserLibrary//这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。

    caseAny//包含所有类型

    }

    3.该方法也是通过相册分类进行查询 用法同上

    // Smart Albums are not supported, only Albums and Moments

    + (PHFetchResult *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;

    4.该方法通过管理iOS8.0之前的AssetsLibrary的唯一标识URL

    + (PHFetchResult *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray *)assetGroupURLs options:(nullable PHFetchOptions *)options;

    还有几个获取系统相册的方法  用法类似 在此不再描述。

    获取相册后,我们需要遍历每一个相册,获取具体的照片内容,下面将介绍几个常用的方法。

    首先介绍一下PHFetchResult类,该类实例对象既可以表示一个相册集合,也可以表示具体的照片集合,就像文件夹一样,文件夹下既可以是文件夹,也可以是具体的文件,因此,我们用它来描述以上获取的相册集合,同样也会用它描述具体的照片集合。

    当我们通过以上方法获取到相册集合后,应当遍历PHFetchResult对象(类似数组,操作与数组相同,只是存储的数据类型为PHAssetCollection对象),如下获取某一个相册集合下的具体一个相册(具体相册即为照片集合):

    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:(PHAssetCollection对象) options:nil];

    如下方法进行了某一个具体的相册查询,其中由于当前result为相册对象,因此获取的图片为相册封面照片,targetSize为目标照片的尺寸,该框架会提供一张你指定的尺寸照片,以达到提升性能的目的,如果缺省会返回原尺寸大小的照片(可能会占用较大内存,不建议这样做哦)。PHImageRequestOptions为照片尺寸的拉伸模式。PHImageRequestOptions参数为照片的获取配置,如果需要从iCloud下载图片,可以详细配置,一般使用默认配置即可。回调block中提供了UIImage对象和照片信息字典。

    PHFetchResult *assetResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];

    [[PHImageManager defaultManager] requestImageForAsset:assetResult.firstObject targetSize:_coverImgView.frame.size contentMode:PHImageContentModeDefault options:[PHImageRequestOptionsnew] resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

    _coverImgView.image = result;

    }];

    以上即为整体美图照片选择器所使用到的Photos框架基本技术,如下为具体的核心代码。

    /*相册配置使用默认即可*/

    PHFetchOptions *fetchOptions = [PHFetchOptionsnew];

    /*初始化相册数组*/

    _deviceAlumDataArr = [NSMutableArray array];

    /* 获取系统创建的相册 */

    PHFetchResult *smartAlbumFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];

    _allAblubResult = smartAlbumFetchResult;

    /*遍历系统创建相册结果集*/

    for(PHAssetCollection *subinsmartAlbumFetchResult) {

    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil];

    if(result.count==0) {

    continue;

    }

    /*添加具体相册到相册数组*/

    [_deviceAlumDataArr addObject:sub];

    }

    /*获取所有的用户创建相册*/

    PHFetchResult *smartAlbumFetchResult2 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:nil];

    /*遍历用户自建相册结果集*/

    for(PHAssetCollection *subinsmartAlbumFetchResult2) {

    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil];

    if(result.count==0) {

    continue;

    }

    /*添加具体相册到相册数组*/

    [_deviceAlumDataArr addObject:sub];

    }

    效果图如下:如果有朋友需要源码,可以到github上面下载哦,喜欢的话记得start😄:https://github.com/China131/JHM_TShow.git

    相关文章

      网友评论

      • 无神:有代码的话,使用markdown编辑器布局效果更好!

      本文标题:利用Photos 框架搭建美图秀秀相册选择器

      本文链接:https://www.haomeiwen.com/subject/eilwjttx.html