PhotoKit是一套比AssetsLibrary更完整也更高效的库,而其处理方式也跟AssetsLibrary有很大的不同。该框架不仅支持照片的编辑,还提供了直接访问照片管理应用程序里的照片和视频资源,包括iCloud照片库。我们可以使用这个框架来检索相册资源显示和播放,且编辑他们的图像或视频内容。


PhotoKit组成

从官方文档可以看出,其成员比较多,下面只介绍几个比较常用的:

  • PHAsseet:代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源;
  • PHFetchOptions:获取资源时的参数,可以传nil,即使用系统默认值;
  • PHFetchResult:表示一系列的资源集合,也可以是相册的集合;
  • PHAssetCollection:表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等);
  • PHCollectionList:表示一组PHCollection,而它本身也是一个PHCollection,因此PHCollection作为一个集合,可以包含其他集合;
  • PHImageManager:用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格;
  • PHImageRequestOptions:如上面所说,控制加载图片时的一系列参数。

还有PHChange
PHAssetChangeRequestPHContentEditingInputPHContentEditingOutput等进行照片资源内容编辑操作的类和其他的一些类。


PhotoKit的使用

访问相册资源

以下是官方demo的代码片段:

PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum
subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];

对上面这段代码进行分析:首先创建一个PHFetchOptions对象,然后设立其根据创建时间排序的option,使用fetchAssetsWithOptions:方法获取所有的相片资源;而使用fetchAssetCollectionsWithType:方法根据特定的type获取指定类型的相册;使用fetchTopLevelUserCollectionsWithOptions:方法可以获取所有用户创建的相册。

以上是获取资源,下面来分析怎样获取可供直接展示的资源:

 // Request an image for the asset from the PHCachingImageManager.
[self.imageManager requestImageForAsset:asset
targetSize:AssetGridThumbnailSize
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {
// Set the cell's thumbnail image if it's still showing the same asset.
if ([cell.representedAssetIdentifier isEqualToString:asset.localIdentifier]){
cell.thumbnailImage = result;
}
}];

imageManager是一个PHCachingImageManager对象,使用requestImageForAsset:targetSize:contentMode:options:resultHandler:方法最后返回的result即为需要的image;而PHCachingImageManager这个类还有另外一个方法:startCachingImagesForAssets:targetSize:contentMode:options:给指定相片资源做缓存。如果是视频资源则可以如下获取:

// Request an AVAsset for the PHAsset we're displaying.
[[PHImageManager defaultManager] requestAVAssetForVideo:self.asset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
CALayer *viewLayer = self.view.layer;
// Create an AVPlayerItem for the AVAsset.
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
playerItem.audioMix = audioMix;
// Create an AVPlayer with the AVPlayerItem.
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
// Create an AVPlayerLayer with the AVPlayer.
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
// Configure the AVPlayerLayer and add it to the view.playerLayer.videoGravity =AVLayerVideoGravityResizeAspect;
playerLayer.frame = CGRectMake(0, 0, viewLayer.bounds.size.width, viewLayer.bounds.size.height);
[viewLayer addSublayer:playerLayer];
[player play];
});
}];

avAsset就是返回的视频资源。

相册的添加、删除、编辑以及处理变更

在做这些操作之前需要添加PHPhotoLibraryChangeObserver协议,然后注册PHPhotoLibrary的观察者:

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];

至于具体的操作,官方文档有关于添加删除编辑相册的例子:Requesting Changes to the Photo Library。之后,实现PHPhotoLibraryChangeObserver的协议方法:photoLibraryDidChange:就OK了,而关于处理变更也有例子:Handling Changes:An Example,。当然,最后记得在dealloc方法里注销这个协议:

[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];

Asset照片或视频资源的删除、编辑

其中一些固有的操作,可直接使用removeAssets:deleteAssets:等方法来实现:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest deleteAssets:@[self.asset]];
} completionHandler:completionHandler];

而其他的一些编辑处理,比如自定义操作。使用PHAssetChangeRequest的contentEditingOutput的属性对象,这就需要我们创建一个PHContentEditingOutput对象,然后进行相应的编辑处理。其中可能用到PHAdjustmentData这个类对操作进行标记描述。而这些都是写在requestContentEditingInputWithOptions:completionHandler:这个方法里的。最后实现PHPhotoLibrary的performChanges:completionHandler:方法。

扩展

参考链接及扩展阅读:照片框架、官方demo、PhotoKit详解(上)、PhotoKit详解(下)、PhotoKit实践及坑点、NSHipster/PHImageManager
可以观看WWDC session --- Introducing the Photos Frameworks 视频学习更多内容,发掘更深的知识,然后自己写一些demo。

Github上有个不错的照片浏览第三框架:MWPhotoBrowser

[绍棠] PhotoKit介绍相关推荐

  1. [绍棠_Swift] SwiftyJSON的使用详解(附样例,用于JSON数据处理)

    1,SwiftyJSON介绍与配置 SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据.生成数据). GitHub地址:https://github. ...

  2. [绍棠] Vue六种传值方式

    前言: 六种传值方式为: 属性传值 $refs $parent 通知传值(广播传值) 本地传值 路由传值 在介绍组件传值之前先明确三种组件关系:父子组件.兄弟组件.无关系组件 上图关系基于:A.B组件 ...

  3. [绍棠] Promise入门详解和基本用法

    异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它 ...

  4. [绍棠] 关于 @synchronized

    @synchronized 结构所做的事情跟锁(lock)类似:它防止不同的线程同时执行同一段代码.但在某些情况下,相比于使用 NSLock 创建锁对象.加锁和解锁来说,@synchronized 用 ...

  5. [绍棠] 正则表达式

    引言 正则表达式(regular expression)就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征.比如 表达式" ...

  6. [绍棠] iOS不错的框架

    入门 Road Map iOS– 开发 iOS 应用从今天开始,苹果指南.★ Lifehacker– 我想写一个 iOS 应用,该从哪里开始? Codeproject– 入门 iPhone 和 iOS ...

  7. [绍棠] Scrapy+Flask+Mongodb+Swift开发全攻略

    Scrapy+Flask+Mongodb+Swift开发全攻略 先一一介绍一下上面4个东西.第一个叫做Scrapy的东西是用python写的爬虫框架. Flask是python写的一个非常有名的web ...

  8. [绍棠] iOS开发中正则表达式的基础使用

    正则表达式?什么是正则表达式? 百度百科给出的解释是这样的:正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 根据我的学习,我理解的正则表达式是:一个字符串,这个字符串用来描述我们 ...

  9. [绍棠] iOS视频播放AVPlayer的视频内容拉伸设置

    使用其中一个叫 videoGravity 的属性,默认设置了AVLayerVideoGravityResize,查看该属性以及相关的其他属性值发现有3种值可以设置, AVLayerVideoGravi ...

最新文章

  1. 0004python中的map,reduce,lambda,filter
  2. python2 print_Python2和Python3中print的不同点
  3. SQL读写CSV文件
  4. koa访问mysql数据库操作
  5. 教你怎么短期内备考并通过PMP考试!
  6. 【统计学】皮尔森相关系数公式理解
  7. 乡镇政府网络智能办公系统(乡镇OA)应用【乡镇信息化经验】
  8. 台式电脑怎么组装步骤_台式机组装教程,详细教您台式机怎么组装
  9. 优化 | 运筹学:从入门到毕业
  10. 奖券数目2.1题目描述有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是N位数,要求其中不要出现带
  11. 托福艺术导向(纪录片《文明》单词总结)PART1
  12. 亚马逊黑五哑火,中国跨境电商高歌猛进!
  13. 男儿当杀人!!!!(诗一首)
  14. PostgreSql 常量
  15. Mac配置mysql环境
  16. 赖大师新文章 :Xilinx 开箱-KV260相机,两个小时轻松搞定,文章不能用我坐飞机过去帮你调哈。
  17. QString 16进制,arg补0,从0xFFFFFFFFFFFFFFFA到0xFA
  18. C++连接SQL的简单例子(win 和 linux)
  19. 洛谷P2472-网络最大流(点的拆分)
  20. What Is New About NewSQL(NewSQL的独到之处)?

热门文章

  1. 【Locust】新版本locust使用入门到分布式,附带脚本模板,复制即用。
  2. cv2.HoughCircles函数的参数
  3. 微信小程序模板消息php,微信小程序模板消息实现(PHP+小程序)
  4. Angular9入门(2)
  5. 上海东原从“野心家”到“大玩家” 连接江湖“人情味”
  6. L1-054 福到了-java
  7. 在MobaXterm中使用键盘快捷键
  8. 大众点评必吃榜的必然
  9. CodeForces 356A - Knight Tournament
  10. 工信部备案新规则下,关于域名核验的相关问题