AssetsLibrary和PhotoKit框架都可以用来封装相册的单选与多选功能,不过ALAssetLibrary的方法在iOS 9中不被推荐了,现在都是用新的框架PhotoKit
的来实现。发现好多之前的应用自定义的XXImagePickerController都无法获取到所有的照片了,为了能让老程序也可以实现这时候就要使用
AssetsLibrary+Photos来解决问题了。
正因为苹果已经做了大量的封装工作,使得开发者在使用PhotoKit的时候非常方便
。
先简单介绍下ALAssetsLibrary:
ALAssetsLibrary 提供了访问iOS设备下照片应用下所有照片和视频的接口.从 ALAssetsLibrary 中可读取所有的相册数据,即 ALAssetsGroup 对象列
表;
从每个 ALAssetsGroup 中可获取到其中包含的照片或视频列表,即 ALAsset 对象列表. 其层次关系为
ALAssetsLibrary -> ALAssetsGroup -> ALAsset -> ALAssetRepresentation.
1、
每个
ALAsset 可能有多个representations表示, 即ALAssetRepresentation 对象;
2、使用其defaultRepresentation 方法可获得其默认representations;
3、使用[asset valueForProperty: ALAssetPropertyRepresentations ]可获取其所有representations的 UTI 数组;
4、从ALAsset对象可获取缩略图 thumbnail 或 aspectRatioThumbnail ;
再简单介绍一下photoKit的框架。photoKit的基本构成有:
1、PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
2、PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
3、PHAssetCollection: PHCollection 的子类,表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删
除,视频列表,收藏等等,如下图所示)
4、PHFetchResult: 表示一系列的资源结果集合,也可以是相册的集合,从 PHCollection 的类方法中获得
5、PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等
规格
PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数
6、PHCollectionList,表示一组 PHCollection,它本身也是一个 PHCollection,因此 PHCollection 作为一个集合,可以包含其他集合,这使到
PhotoKit 的组成比 ALAssetLibrary 要复杂一些。另外与 ALAssetLibrary 相似,一个 PHAsset 可以同时属于多个不同的 PHAssetCollection,最常见的
例子就是刚刚拍摄的照片,至少同时属于“最近添加”、“相机胶卷”以及“照片 - 精选”这三个 PHAssetCollection.
photoKit获取所有照片
- (NSMutableArray *)getAllPhoto{ NSMutableArray *arr = [NSMutableArray array]; // 所有智能相册 PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; for (NSInteger i = 0; i < smartAlbums.count; i++) { PHCollection *collection = smartAlbums[i]; //遍历获取相册 if ([collection isKindOfClass:[PHAssetCollection class]]) { PHAssetCollection *assetCollection = (PHAssetCollection *)collection; PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil]; PHAsset *asset = nil; if (fetchResult.count != 0) { for (NSInteger j = 0; j < fetchResult.count; j++) { //从相册中取出照片 asset = fetchResult[j]; PHImageRequestOptions *opt = [[PHImageRequestOptions alloc]init]; opt.synchronous = YES; PHImageManager *imageManager = [[PHImageManager alloc] init]; [imageManager requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:opt resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { if (result) { [arr addObject:result]; } }]; } } } } //返回所有照片 return arr;
下边是我对多图片选择功能的封装,首先我判断了系统版本 支持任何的版本 iOS8之前使用了ALAssetsLibrary框架进行封装,iOS8和大于iOS8以后的版本使用photoKit的框架进行封装。 实现了自定义相册,点击弹出相册。 可以自行设置选择相片的张数,可以单选和多选。 直接导入WPhoto可以实现该功能。 使用UIcollectionView和基本的框架进行了基本的封装。
if ([phoneVersionintegerValue] >=8) {
//高版本使用PhotoKit框架
[selfgetHeightVersionAllPhotos];
}
else {
//低版本使用ALAssetsLibrary框架
[selfgetLowVersionAllPhotos];
}
}
直接调用WPhotoViewController就可以了,可以自定规定选择照片的张数。
在WPMacros中可以修改这些属性值