首先在iOS8.0之前苹果是使用 AssetsLibrary这套框架来获取和操作系统的相册的,然而在iOS8.0之后,苹果大大推出了 PhotoKit ,PhotoKit 是一套比 AssetsLibrary 更完整也更高效的库,对资源的处理跟 AssetsLibrary 也有很大的不同,可以观察照片库的变化和创建提交自己修改的改变。由于iOS现在都是iOS10了,所以本文只介绍iOS8.0后的photoKit。
首先简单介绍几个概念:
- PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
- PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
- PHFetchResult: 表示一系列的资源集合,也可以是相册的集合
- PHAssetCollection: 表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等)
- PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
- PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数
获取和操作图片的基本操作主要使用上面类的步骤是PHFetchResult(获取资源集合)
--> PHFetchOptions (设置获取资源时的对应参数)
--> PHAssetCollection (特定的一个相册资源)
--> 获取相册里的所有图片的PHAsset对象
--> 根据PHAsset获取图片信息
接下来就直接用代码块来解释如何获取和处理图片吧
iOS 8.0 以上获取所有照片用Photos.h这个库
#pragma mark -- iOS 8.0 以上获取所有照片用Photos.h这个库
-(NSMutableArray*)GetALLphotosUsingPohotKit
{
NSMutableArray *arr = [NSMutableArray array];
// 所有智能相册
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (NSInteger i = 0; i < smartAlbums.count; i++) {
// 是否按创建时间排序
PHFetchOptions *option = [[PHFetchOptions alloc] init];
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
PHCollection *collection = smartAlbums[i];
//遍历获取相册
if ([collection isKindOfClass:[PHAssetCollection class]]) {
if ([collection.localizedTitle isEqualToString:@"相机胶卷"]) {
PHAssetCollection *assetCollection = (PHAssetCollection *)collection;
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
NSArray *assets;
if (fetchResult.count > 0) {
// 某个相册里面的所有PHAsset对象
assets = [self getAllPhotosAssetInAblumCollection:assetCollection ascending:YES ];
[arr addObjectsFromArray:assets];
}
}
}
}
//返回相机胶卷内的所有照片
return arr;
}
获取相册里的所有图片的PHAsset对象
#pragma mark - < 获取相册里的所有图片的PHAsset对象 >
- (NSArray *)getAllPhotosAssetInAblumCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
// 存放所有图片对象
NSMutableArray *assets = [NSMutableArray array];
// 是否按创建时间排序
PHFetchOptions *option = [[PHFetchOptions alloc] init];
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
// 获取所有图片对象
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:assetCollection options:option];
// 遍历
[result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL * _Nonnull stop) {
[assets addObject:asset];
}];
return assets;
}
根据PHAsset获取图片信息
#pragma mark - < 根据PHAsset获取图片信息 >
- (void)accessToImageAccordingToTheAsset:(PHAsset *)asset size:(CGSize)size resizeMode:(PHImageRequestOptionsResizeMode)resizeMode completion:(void(^)(UIImage *image,NSDictionary *info))completion
{
static PHImageRequestID requestID = -2;
CGFloat scale = [UIScreen mainScreen].scale;
CGFloat width = MIN([UIScreen mainScreen].bounds.size.width, 500);
if (requestID >= 1 && size.width / width == scale) {
[[PHCachingImageManager defaultManager] cancelImageRequest:requestID];
}
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
// option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.resizeMode = resizeMode;
requestID = [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(result,info);
});
}];
}
扩展
本文相当于一个获取和操作系统相册的基本流程,其中方法的细节并未深入介绍,如读者需要深入了解可进一步扩展photoKit详解上,photoKit详解下。
ps:如果对您有帮助请给个赞,万分感谢。
网友评论