Photos.framework是iOS8后苹果推出的一套替代AssetsLibrary.framework获取相册资源的原生库,至于AL库,欢迎大家给博文iOS开发——简单实现图片多选功能(AssetsLibrary.framework篇)提出宝贵的意见。
楼主大部分都是查看官方开发文档进行探索的(当然,实在不明白了也会请求google 的 0.0 )。这里就说一下个人的看法吧,相比AL库,Photos的开发文档显然更像是目前我们接触的ObjC语言(如果不信,可以对比一下AL库和Photos库的开发文档)。初次接触这个库的时候可能会感觉比较乱,毕竟类的数量比AL库多了好多,但在熟悉大体逻辑之后,就会发现它的分工比AL更加明确,并且使用起来要比AL灵活的多。
提醒一下,要使用相册资源库的时候,为了适配一下将来的iOS10,不要忘记在info.plist文件中加入NSPhotoLibraryUsageDescription
这个描述字段啊,更多的权限坑请关注一下博文 iOS开发——iOS 10 由于权限问题导致崩溃的那些坑
ObjC- 全代码 : https://github.com/RITL/RITLImagePickerDemo
2017-01-22 更新
Swift - 全代码:https://github.com/RITL/Swift-RITLImagePickerDemo
Swift-Demo 重写完不久,可能Swift的编程思想还不是领略的很好,但楼主会继续努力。
![](https://i-blog.csdnimg.cn/blog_migrate/4e38fed58bf7bbf9275363760a9f5853.webp?x-image-process=image/format,png)
Objc-Demo的用法如下:
RITLPhotoNavigationViewModel * viewModel = [RITLPhotoNavigationViewModel new];
__weak typeof(self) weakSelf = self;
// 设置需要图片剪切的大小,不设置为图片的原比例大小
// viewModel.imageSize = _assetSize;
viewModel.RITLBridgeGetImageBlock = ^(NSArray <UIImage *> * images){
//获得图片
__strong typeof(weakSelf) strongSelf = weakSelf;
strongSelf.assets = images;
[strongSelf.collectionView reloadData];
};
viewModel.RITLBridgeGetImageDataBlock = ^(NSArray <NSData *> * datas){
//可以进行数据上传操作..
};
RITLPhotoNavigationViewController * viewController = [RITLPhotoNavigationViewController photosViewModelInstance:viewModel];
[self presentViewController:viewController animated:true completion:^{}];
Swift- Demo用法
//获得控制器
let viewController : RITLPhotoNavigationViewController = RITLPhotoNavigationViewController()
//设置viewModel属性
let viewModel = viewController.viewModel
// 获得图片
viewModel.completeUsingImage = {(images) in
}
// 获得资源的data数据
viewModel.completeUsingData = {(datas) in
//coding for data ex: uploading..
print("data = \(datas)")
}
self.present(viewController, animated: true) {}
话说的有点多了,下面就谈谈个人对Photos的理解,这里只记录一下Photos.framework中类的使用与理解,真正的实现多选功能请前去上面的链接下载demo查看,多谢指正:
类逻辑
研究一个库或者框架,总体逻辑一定是要缕清的,下面就是个人对photos的理解,有点多,分类一下吧:
资源类
- PHPhotoLibrary 是一个资源库。能够获取相册权限以及对相册的操作,与AL不同,它不能获取资源对象哦.
- PHFetchResult 是一个结果集,一个泛型类。通过方法获取到的相册或者资源组就是被封装成该类返回.
- PHAssetCollection 是一个资源集合对象。其实它就是一个相册的概念,可通过
类方法
获得想要的相册集合,继承自PHCollection. - PHCollectionList 是一个资源集合列表对象。刚接触时以为它是存放PHCollection对象的集合,后来才知道,如果想要通过地点以及时间分组的话,请使用这个类替代PHAssetCollection吧,用法与PHAssetCollection类似,同样是继承自PHCollection.
- PHAsset 是一个独立的资源对象。可以通过
类方法
对PHCollection对象进行遍历,获得存放Asset对象的结果集,可以直接获得资源的规格数据,若想获得图片以及原图等资源,需要配合PHImageManager对象,继承自PHObject.
工具类
- PHFetchOptions 一个遍历配置类。一般情况下,当存在遍历方法的时候就存在这个类型的参数,里面含有谓词、遍历顺序等属性,可以通过设置这些属性,完成不同的遍历.
- PHImageManager 是一个负责渲染资源的类。比如获得PHAsset对象的原图等操作需要使用该类.
- PHCachingImageManager 继承自PHImageManager,可以对请求的资源对象进行缓存,这样再次获取时就不需要重新渲染,在加快获取速度的同时也降低了CPU的压力,这里最好对缓存的PHImageRequestID进行一下记录,防止同一资源被无限缓存的尴尬.
- PHImageRequestOptions 是一个资源请求的配置类。通常在使用PHImageManager对某个资源进行请求时都会存在此类型的参数,可以在请求资源时对该对象进行设置,获得想要的结果,比如原图..
请求类
- 请求类不能独立使用,要想发挥作用,需要与PHPhotoLibrary对象配合使用.
- PHAssetCollectionChangeRequest 集合变化请求类,负责对PHAssetCollection对象的操作
- PHCollectionListChangeRequest 集合变化请求类,负责PHCollectionList对象的操作
- PHA