PhotoKit框架介绍及使用
PhotoKit 是一套比 AssetsLibrary 更新更完整也更高效的ios照片处理库,对资源的处理跟 AssetsLibrary 有很大的不同。下面简单介绍下PhotoKit的几个基本概念
- PHAsset:代表照片库中的特定资源,PHAsset对象来表示存储在照片应用程序中或云端的一个图片或视频文件。为了显示或编辑asset,我们需要使用PHAsset类的获取asset来处理它,一个asset对象是不可变的,只包含它所代表的照片或视频的元数据。
- PHFetchOptions:使用PHFetchOptions对象来指定选项,在PHAsset, PHCollection, PHAssetCollection, and PHCollectionList上根据它的对象来检索照片符合要求的实体。我们可以根据一些key来对要显示的照片进行排序。下面是支持的key

- PHFetchResult: 表示一系列的资源集合,也可以是相册的集合。它是一个有序的存储照片实体的容器。它是一个泛型集合
- PHAssetCollection: 表示一个相册
- PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
- PHImageRequestOptions: 控制加载图片时的一系列参数
下面详细介绍库的使用
我们需要导入Photos.framework
1.PHPhotoLibrary:表示用户的照片库,包括对象存储在本地设备和(如果已启用)在iCloud照片。我们使用PHPhotoLibrary来对照片库进行操作。可以添加编辑删除。
例如使用PHPhotoLibrary来实现拍照功能。
[_mCamera capturePhotoAsJPEGProcessedUpToFilter:_mFilter withCompletionHandler:^(NSData *processedJPEG, NSError *error){
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[[PHAssetCreationRequest creationRequestForAsset] addResourceWithType:PHAssetResourceTypePhoto data:processedJPEG options:nil];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
}];
}];
2.PHAssetChangeRequest,PHAssetCollectionChangeRequest,PHAssetCreationRequest,PHCollectionListChangeRequest:你可以在PHPhotoLibrary的change block中创建一个它们的对象来对asset对象进行添加,编辑,删除
在上面那段代码中我们展现了PHAssetCreationRequest的添加操作。
[[PHAssetCreationRequest creationRequestForAsset] addResourceWithType:PHAssetResourceTypePhoto data:processedJPEG options:nil];
3.PHAssetCollectionType相册类型
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum = ,
PHAssetCollectionTypeSmartAlbum = ,
PHAssetCollectionTypeMoment = ,
} NS_ENUM_AVAILABLE_IOS(8_0);
[PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]
输出:
-- ::59.392 FWLifeApp[:] Favorites -- ::59.394 FWLifeApp[:] Recently Deleted -- ::59.394 FWLifeApp[:] Panoramas -- ::59.394 FWLifeApp[:] Camera Roll -- ::59.396 FWLifeApp[:] Slo-mo -- ::59.396 FWLifeApp[:] Screenshots -- ::59.397 FWLifeApp[:] Bursts -- ::59.398 FWLifeApp[:] Videos -- ::59.398 FWLifeApp[:] Selfies -- ::59.399 FWLifeApp[:] Hidden -- ::59.400 FWLifeApp[:] Time-lapse -- ::59.400 FWLifeApp[:] Recently Added
我们可以看出PHAssetCollectionTypeSmartAlbum包含许多相册集。收藏,最近删除,最近添加,相机胶卷等,而不包含时刻.
NSMutableArray<FWPhotoAlbums *> *mArr = [NSMutableArray array];
PHFetchResult *smartAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[smartAlbum enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//过滤掉最近删除的,和视频
if (obj.assetCollectionSubtype != && obj.assetCollectionSubtype < ) {
NSArray <PHAsset *> *assets = [self getAssetsInAssetCollection:obj ascending:NO];
if ([assets count]) {
FWPhotoAlbums *pa = [[FWPhotoAlbums alloc] init];
pa.albumName = [self TitleOfAlbumForChinse:obj.localizedTitle];
pa.albumImageCount = [assets count];
pa.firstImageAsset = assets.firstObject;
pa.assetCollection = obj;
[mArr addObject:pa];
}
}
}];
我们需要进一步获取每个相册集下的所有照片。对照片的creationDate key进行排序
- (PHFetchResult *)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options]; return result;
} - (NSArray <PHAsset *> *)getAssetsInAssetCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
NSMutableArray <PHAsset *> *mArr = [NSMutableArray array];
PHFetchResult *result = [self fetchAssetsInAssetCollection:assetCollection ascending:ascending];
[result enumerateObjectsUsingBlock:^(PHAsset * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.mediaType == PHAssetMediaTypeImage) {
[mArr addObject:obj];
}
}]; return mArr;
}
获取图片
- (void)requestImageForAsset:(PHAsset *)asset size:(CGSize)size resizeMode:(PHImageRequestOptionsResizeMode)resizeMode completion:(void (^)(UIImage *, NSDictionary *))completion
{
static PHImageRequestID requestID = -;
CGFloat scale = [UIScreen mainScreen].scale;
CGFloat width = MIN(WIDTH, );
if (requestID >= && size.width/width==scale) {
[[PHCachingImageManager defaultManager] cancelImageRequest:requestID];
} PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.resizeMode = resizeMode;
option.networkAccessAllowed = YES; requestID = [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
BOOL downloadFinined = ![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey];
if (downloadFinined && completion) {
completion(image, info);
}
}];
}
PhotoKit框架介绍及使用的更多相关文章
- iOS框架介绍
iOS框架介绍 Cocoa Touch GameKit 实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息 iOS设备之间蓝牙数据传输 从iOS7开始过期 局域网游 ...
- iOS 常用框架介绍
iOS框架介绍 Cocoa Touch GameKit 实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息 iOS设备之间蓝牙数据传输 从iOS7开始过期 局域网游 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
[连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目 录 第一章 通讯框架介绍... 2 1.1 通讯的本质... 2 1 ...
- YARN基本框架介绍
YARN基本框架介绍 转载请注明出处:http://www.cnblogs.com/BYRans/ 在之前的博客<YARN与MRv1的对比>中介绍了YARN对Hadoop 1.0的完善.本 ...
- Selenium自动化测试框架介绍
Selenium自动化测试框架介绍 1.测试架构作用 a.可维护性 b.提高编写脚本效率 c.提高脚本的可读性 2.框架的几大要素: Driver管理,脚本,数据,元素对象,LOG,报告,运行机制,失 ...
- UiAutomator自动化测试框架介绍
UiAutomator自动化测试框架介绍 环境搭建 1 必要条件 1.1 JDK 1.2 SDK(API高于15) 1.3 Eclipse 2 ...
- [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续
英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...
- MJExtension框架介绍
MJExtension框架介绍 标签: MJExtension 2015-05-01 08:22 1120人阅读 评论(0) 收藏 举报 分类: Foundation(14) 版权声明:本文为博主 ...
- 人工智能深度学习Caffe框架介绍,优秀的深度学习架构
人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...
随机推荐
- 【Hello CC.NET】自动化发布时 Web.config 文件维护
在 <[Hello CC.NET]CC.NET 实现自动化集成> 的 HellowWorld 中经实现: 1.获取源码 2.编译项目 3.集成测试 4.Ftp发布项目 5.创建安装包 6. ...
- 自己写一个java.lang.reflect.Proxy代理的实现
前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...
- 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...
- java提高篇(十四)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- HTTP协议解析
1. HTTP版本 HTTP/1.0 HTTP/1.1 HTTP-NG 2. 会话方式 HTTP/1.0 建立连接->请求->响应->断开连接 每次连接只处理一次请求和相应,对资源的 ...
- Spring Trasnaction管理(3)- 事务嵌套
问题导读 Spring 如何管理嵌套的事务 Spring事务传播机制 Nested 和 RequireNew 有何区别 事务传播机制 事务的传播机制应该都比较熟悉 在日常开发中会遇到需要事务嵌套的情况 ...
- Java基础之泛型
泛型: (1)为什么会出现泛型? 因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患, 如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题. JDK1.5后出 ...
- 第三天 vi编辑器使用和软件安装
[复习] 判断题: 查看某文件权限为rwxr-xr-- ,则其所属组权限为只读. 对一个目录有w权限,表示可以修改目录下文件内容. 3..tar.gz格式的压缩包可以使用tar -xjf解压缩 4.m ...
- Nodejs·内存控制
之前有考虑过Node中的内存管理,但是没想到Node的内存机制与JVM如此相像. 看完这部分的内容,基本可以了解Node中的内存使用技巧: 1 尽量不要做过多的缓存 2 使用队列应该有限制 3 注意全 ...
- struts2学习笔记之六:struts2的Action访问ServletAPI的几种方式
方法一:通过ActionContext访问SerlvetAPI,这种方式没有侵入性 Action类部分代码 import com.opensymphony.xwork2.ActionContext; ...