PhotoKit是iOS8出的一个新的图片选择框架,用来取代以前的AssetsLibrary框架,相比较AssetsLibrary来说PhotoKit更加灵活,而在iOS9中,AssetsLibrary已经被弃用,也不支持LivePhoto,并且使用AssetsLibrary时,图片的分辨率会变低,接下来就介绍一下PhotoKit。
一、PhotoKit 基本构成
1.PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
2.PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
3.PHAssetCollection: PHCollection 的子类,表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示)
4.PHFetchResult: 表示一系列的资源结果集合,也可以是相册的集合,从?PHCollection 的类方法中获得
5.PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
6.PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数
二、获取相册里面的图片
// 1.请求选项设置
self.options = [[PHImageRequestOptions alloc] init];
self.options.resizeMode = PHImageRequestOptionsResizeModeExact;//自定义图片大小的加载模式
self.options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
self.options.synchronous = NO;// 是否同步加载
// 2.容器类
// 获取所有资源的集合,并按资源的创建时间排序
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
self.assets = [PHAsset fetchAssetsWithOptions:fetchOptions];
获取图片资源
[[PHImageManager defaultManager] requestImageForAsset:assets[index] targetSize: CGSizeMake(300, 300) contentMode:PHImageContentModeAspectFill options:_options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// 返回图片
image = result;
}];
三、获取相册集
1.获取系统相册,就是手机创建好的相册
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (PHAssetCollection *collection in smartAlbums) {
PHFetchResult *results = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
// NSLog(@"相册名:%@,有%ld张图片",collection.localizedTitle,results.count);
// 存储assets's名字
[self.albumNameArr addObject:collection.localizedTitle];
// 存储assets's内容
[self.albumAssetsArr addObject:results];
}
2.用户自定义的相册资源
PHFetchResult *customCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (PHAssetCollection *collection in customCollections) {
PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
[self.albumNameArr addObject:collection.localizedTitle];
[self.albumAssetsArr addObject:assets];
}
根据需求选择相册类型+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
四、获取相册里视频集
1.获取视频集
// PHFetchOptions中的谓词过滤获取
PHFetchOptions *fetchOption = [[PHFetchOptions alloc] init];
// 其中:key是PHAsset类的属性 这是一个KVC
fetchOption.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:true]];
//fetchOption.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeVideo];
//self.assets = [PHAsset fetchAssetsWithOptions:fetchOption];
// 视频类型 PHAssetMediaTypeVideo
self.assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:fetchOption];
self.options = [[PHVideoRequestOptions alloc] init];
self.options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
[self.options setNetworkAccessAllowed:true];
1.获取视频信息,包括时长和播放地址
[[PHImageManager defaultManager] requestAVAssetForVideo:self.assets[indexPath.row] options:self.options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
dispatch_async(dispatch_get_main_queue(), ^{
NSURL *URL = ((AVURLAsset*)asset).URL;
_aVPlayerViewController = [[AVPlayerViewController alloc]init];
_aVPlayerViewController.player = [[AVPlayer alloc]initWithURL:URL];
[self presentViewController:_aVPlayerViewController animated:YES completion:nil];
});
}];
五、相册里面现实中文
相册里面现实中文需要配置plist文件:
- 设置
Localization native development region
为cn
(中文),en
(英文)。 - 设置
Localized resources can be mixed
为YES
到这里基本上能获取到相册里所有信息了,具体的选择照片我这边还没有做,你们可以自己去实现,后边我们会加上去。
具体的代码在我的Demo里面,Demo里面有仿微信相册以及仿简书相册,大致框架有了,还没有去做详细的实现,大家可以下载下来看看,有好的建议和想法可以评论告诉我哈!PhotoKit比较详细的介绍可以看看这篇博文写的挺好的。