[绍棠] PhotoKit介绍
PhotoKit是一套比AssetsLibrary更完整也更高效的库,而其处理方式也跟AssetsLibrary有很大的不同。该框架不仅支持照片的编辑
,还提供了直接访问
照片管理应用程序里的照片和视频资源,包括iCloud照片库。我们可以使用这个框架来检索相册资源显示和播放,且编辑他们的图像或视频内容。
PhotoKit组成
从官方文档可以看出,其成员比较多,下面只介绍几个比较常用的:
- PHAsseet:代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源;
- PHFetchOptions:获取资源时的参数,可以传nil,即使用系统默认值;
- PHFetchResult:表示一系列的资源集合,也可以是相册的集合;
- PHAssetCollection:表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等);
- PHCollectionList:表示一组PHCollection,而它本身也是一个PHCollection,因此PHCollection作为一个集合,可以包含其他集合;
- PHImageManager:用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格;
- PHImageRequestOptions:如上面所说,控制加载图片时的一系列参数。
还有PHChange
、
PHAssetChangeRequest
、PHContentEditingInput
、PHContentEditingOutput
等进行照片资源内容编辑操作的类和其他的一些类。
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介绍相关推荐
- [绍棠_Swift] SwiftyJSON的使用详解(附样例,用于JSON数据处理)
1,SwiftyJSON介绍与配置 SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据.生成数据). GitHub地址:https://github. ...
- [绍棠] Vue六种传值方式
前言: 六种传值方式为: 属性传值 $refs $parent 通知传值(广播传值) 本地传值 路由传值 在介绍组件传值之前先明确三种组件关系:父子组件.兄弟组件.无关系组件 上图关系基于:A.B组件 ...
- [绍棠] Promise入门详解和基本用法
异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它 ...
- [绍棠] 关于 @synchronized
@synchronized 结构所做的事情跟锁(lock)类似:它防止不同的线程同时执行同一段代码.但在某些情况下,相比于使用 NSLock 创建锁对象.加锁和解锁来说,@synchronized 用 ...
- [绍棠] 正则表达式
引言 正则表达式(regular expression)就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征.比如 表达式" ...
- [绍棠] iOS不错的框架
入门 Road Map iOS– 开发 iOS 应用从今天开始,苹果指南.★ Lifehacker– 我想写一个 iOS 应用,该从哪里开始? Codeproject– 入门 iPhone 和 iOS ...
- [绍棠] Scrapy+Flask+Mongodb+Swift开发全攻略
Scrapy+Flask+Mongodb+Swift开发全攻略 先一一介绍一下上面4个东西.第一个叫做Scrapy的东西是用python写的爬虫框架. Flask是python写的一个非常有名的web ...
- [绍棠] iOS开发中正则表达式的基础使用
正则表达式?什么是正则表达式? 百度百科给出的解释是这样的:正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 根据我的学习,我理解的正则表达式是:一个字符串,这个字符串用来描述我们 ...
- [绍棠] iOS视频播放AVPlayer的视频内容拉伸设置
使用其中一个叫 videoGravity 的属性,默认设置了AVLayerVideoGravityResize,查看该属性以及相关的其他属性值发现有3种值可以设置, AVLayerVideoGravi ...
最新文章
- 0004python中的map,reduce,lambda,filter
- python2 print_Python2和Python3中print的不同点
- SQL读写CSV文件
- koa访问mysql数据库操作
- 教你怎么短期内备考并通过PMP考试!
- 【统计学】皮尔森相关系数公式理解
- 乡镇政府网络智能办公系统(乡镇OA)应用【乡镇信息化经验】
- 台式电脑怎么组装步骤_台式机组装教程,详细教您台式机怎么组装
- 优化 | 运筹学:从入门到毕业
- 奖券数目2.1题目描述有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是N位数,要求其中不要出现带
- 托福艺术导向(纪录片《文明》单词总结)PART1
- 亚马逊黑五哑火,中国跨境电商高歌猛进!
- 男儿当杀人!!!!(诗一首)
- PostgreSql 常量
- Mac配置mysql环境
- 赖大师新文章 :Xilinx 开箱-KV260相机,两个小时轻松搞定,文章不能用我坐飞机过去帮你调哈。
- QString 16进制,arg补0,从0xFFFFFFFFFFFFFFFA到0xFA
- C++连接SQL的简单例子(win 和 linux)
- 洛谷P2472-网络最大流(点的拆分)
- What Is New About NewSQL(NewSQL的独到之处)?
热门文章
- 【Locust】新版本locust使用入门到分布式,附带脚本模板,复制即用。
- cv2.HoughCircles函数的参数
- 微信小程序模板消息php,微信小程序模板消息实现(PHP+小程序)
- Angular9入门(2)
- 上海东原从“野心家”到“大玩家” 连接江湖“人情味”
- L1-054 福到了-java
- 在MobaXterm中使用键盘快捷键
- 大众点评必吃榜的必然
- CodeForces 356A - Knight Tournament
- 工信部备案新规则下,关于域名核验的相关问题