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框架介绍及使用的更多相关文章

  1. iOS框架介绍

    iOS框架介绍      Cocoa Touch   GameKit  实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息  iOS设备之间蓝牙数据传输   从iOS7开始过期   局域网游 ...

  2. iOS 常用框架介绍

    iOS框架介绍      Cocoa Touch   GameKit  实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息  iOS设备之间蓝牙数据传输   从iOS7开始过期   局域网游 ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍

    [连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目       录 第一章           通讯框架介绍... 2 1.1           通讯的本质... 2 1 ...

  4. YARN基本框架介绍

    YARN基本框架介绍 转载请注明出处:http://www.cnblogs.com/BYRans/ 在之前的博客<YARN与MRv1的对比>中介绍了YARN对Hadoop 1.0的完善.本 ...

  5. Selenium自动化测试框架介绍

    Selenium自动化测试框架介绍 1.测试架构作用 a.可维护性 b.提高编写脚本效率 c.提高脚本的可读性 2.框架的几大要素: Driver管理,脚本,数据,元素对象,LOG,报告,运行机制,失 ...

  6. UiAutomator自动化测试框架介绍

    UiAutomator自动化测试框架介绍 环境搭建 1         必要条件 1.1       JDK 1.2       SDK(API高于15) 1.3       Eclipse 2    ...

  7. [翻译]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 ...

  8. MJExtension框架介绍

    MJExtension框架介绍 标签: MJExtension 2015-05-01 08:22 1120人阅读 评论(0) 收藏 举报  分类: Foundation(14)  版权声明:本文为博主 ...

  9. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...

随机推荐

  1. 必应词典UWP版-开发小结

    摘要 必应词典UWP版已经上线2周了!相信有不少用户都已经体验过了吧!得益于Win10全新.强大的API,新版词典在性能上.UI体验上都有了大幅的提升,今天,小编就为大家讲讲必应词典UWP开发的故事. ...

  2. 千万用户级别应用系统背后的SOA组件化容器

    背景 在<我们的应用系统是如何支撑千万级别用户的>随笔中已经从“宏观”角度去介绍了整个应用系统的布局.组件化是整个系统由头到尾都始终坚持的一个设计原则,其中“SOA组件化容器”也是我们应用 ...

  3. angularjs ng-option ie issue解决方案

    最近遇见angularjs 在IE上当使用ng-options作为select的选项数据源,并且被套在ng-switch(ng-transclude)之类的,当angular上得ng-options数 ...

  4. 用“MEAN”技术栈开发web应用(一)AngularJs前端架构

    前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...

  5. Android中viewPager的一两点使用

    Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...

  6. 解决服务器每次都要输入Enter PEM pass phrase

    今天架设好Python的HTTPS云服务器, 发现每次连接都要Enter PEM pass phrase 把服务器端的key里面的key剥离掉就好了 openssl rsa -in server.ke ...

  7. Composer使用

    是什么 如果你知道yum.apt-get.npm.bower等命令中的一种或者多种,那么,你也能很快知道composer是什么了.没错,它就是PHP里快速安装类库的.平时,我们安装一个PHP类库,需要 ...

  8. yar粗略使用记录

    yar是鸟哥(laruence)开发的一个并行的RPC框架.据说sina weibo已经在大规模使用这个框架了.今天初步使用了下,觉得还是挺爽的一个工具. 什么情况适用这个工具呢? 比如一般你有个微博 ...

  9. fir.im Weekly - 94 个 iOS 开发资源推荐

    距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...

  10. C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)

    一.空操作符(??)在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空值或是一个指定的值.通常我们会这样来处理: .string name = value; if (name ...