利用Photos 框架搭建美图秀秀相册选择器
简介:Photos框架是iOS8.0后推出的一个新的用于对系统相册进行相关操作的,在iOS8.0之前,开发中只能使用AssetsLibrary框架来访问移动设备的图片库。本文中不再对AssetsLibrary做过多的介绍,仅针对Photos框架进行详细介绍。并且以美图秀秀的照片选择器作为实例载体进行功能实现。
首先要获取系统的所有相册,有多个方法可以选择
1.该方法通过唯一标识符identifiers来获取相册 PHFetchOptions为将要获取到了相册的相关属性对象
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
2.该方法通过PHAssetCollectionType 相册分类枚举值获取相关相册 PHAssetCollectionSubtype 为子类型 即进一步想相册分类 如Album和 AlbumCoundShared组合表示从iTunes同步来的 并且是从icloud分享来的相册
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
相关枚举值如下
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum = 1, //从iTunes同步而来的及用户自建的相册
PHAssetCollectionTypeSmartAlbum = 2,//相机拍摄而成的相册
PHAssetCollectionTypeMoment = 3,//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 //包含所有类型
}
3.该方法也是通过相册分类进行查询 用法同上
// Smart Albums are not supported, only Albums and Moments + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;
4.该方法通过管理iOS8.0之前的AssetsLibrary的唯一标识URL
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray<NSURL *> *)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:[PHImageRequestOptions new] resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { _coverImgView.image = result; }];
以上即为整体美图照片选择器所使用到的Photos框架基本技术,如下为具体的核心代码。
/* 相册配置 使用默认即可 */
PHFetchOptions *fetchOptions = [PHFetchOptions new]; /* 初始化相册数组 */
_deviceAlumDataArr = [NSMutableArray array]; /* 获取系统创建的相册 */
PHFetchResult *smartAlbumFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
_allAblubResult = smartAlbumFetchResult; /* 遍历系统创建相册结果集 */
for (PHAssetCollection *sub in smartAlbumFetchResult) {
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil]; if (result.count==) {
continue;
} /* 添加具体相册到相册数组 */
[_deviceAlumDataArr addObject:sub]; } /* 获取所有的用户创建相册 */
PHFetchResult *smartAlbumFetchResult2 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:nil]; /* 遍历用户自建相册结果集 */
for (PHAssetCollection *sub in smartAlbumFetchResult2) { PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil]; if (result.count==) {
continue;
}
/* 添加具体相册到相册数组 */
[_deviceAlumDataArr addObject:sub]; }
效果图如下:如果有朋友需要源码,可以到github上面下载哦,喜欢的话记得start
利用Photos 框架搭建美图秀秀相册选择器的更多相关文章
- 简易的美图秀秀利用别人的so库
在实际开发中,有时候时间短,任务量大,可以查看类似的apk,将行apk反编译,通过看源码分析,用里面的JNI代码! 本案例中用了美图秀秀的JNI.java和jni.so链接库 项目中调用别人写的c代码 ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- iOS开发系列--打造自己的“美图秀秀”
概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Co ...
- iOS:iOS开发系列–打造自己的“美图秀秀”(下)
来源: KenshinCui 链接:http://www.cnblogs.com/kenshincui/p/3959951.html 运行效果: 其他图形上下文 前面我们也说过,Quartz 2D的图 ...
- 美图秀秀api实现图片的裁剪及美化
美图秀秀不仅有PC版.手机版等客户端的软件,还有Web开方接口,可以在web页面上调用美图秀秀的api接口,实现图片的编辑.像淘宝.网易.qq空间.新浪微博等大厂都使用过该接口. 官网地址:http: ...
- iOS 图片部分模糊,类似于美图秀秀
代码地址如下:http://www.demodashi.com/demo/14277.html 演示效果 演示效果 代码结构 项目结构截图如下: 该模块的核心源码部分为 MBPartBlurView, ...
- 强大的Core Image(教你做自己的美图秀秀))
iOS5新特性:强大的Core Image(教你做自己的美图秀秀)) iOS5给我们带来了很多很好很强大的功能和API.Core Image就是其中之一,它使我们很容易就能处理图片的各种效 ...
- 美图秀秀 web开发图片编辑器
美图秀秀web开发平台 http://open.web.meitu.com/wiki/ 1.环境配置 1.1.设置crossdomain.xml 下载crossdomain.xml文件,把解压出来的c ...
- 美图秀秀web开发文档
Xiuxiu 组件 import React, { Component } from 'react'; class XiuXiu extends Component { componentDidMou ...
随机推荐
- 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...
- RecyclerView的使用(四)
前面我们已经实现了RecyclerView的大部分功能了,但是有个很明显的缺陷-------没有点击效果!这就坑爹了 ListView自带点击效果好嘛!连这个都要自己定义.... 话不多说,下面就来为 ...
- 篇一:js中动态加载---append
之前是一行代码,不能动态加载,新的需求要动态加载,使用append $('#Order_information').append(' <div class="single_produc ...
- wcf测试证书的创建
如何创建证书: makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=JiangServer -sky exchange -pe (服务端证书) ...
- matlab进阶:常用功能的实现,常用函数的说明
常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...
- MYSQL之基本操作
数据库操作 一.查看所有的数据库 show databases; 二.创建数据库 create database userinfo; 说明: 创建了一个名为userinfo的数据库 三.使用数据库 u ...
- [uva11722&&cogs1488]和朋友会面Joining with Friend
几何概型,<训练指南>的题.分类讨论太神啦我不会,我只会萌萌哒的simpson强上~这里用正方形在y=x-w的左上方的面积减去在y=x+w左上方的面积就是两条直线之间的面积,然后切出来的每 ...
- WinForm------GridControl合并单元格
1.修改GridView的属性 2.点击Run Design修改需要合并的列的属性 3.给GridView添加事件(以上两步不行的情况下再使用此方法) private void gridView1_C ...
- php无刷新上传图片和文件
核心思想:通过Html的iframe标签属性操作顶级窗口,再用php动态无刷新上传图片文件. 示例如下: demo |------uploads #存放上传的文件 |------index.php | ...
- JQuery常用方法总结
1.json的创建方式 <script> $(function () { //第一种 var my = new People("CallmeYhz", 26); ale ...