PhotoKit
一、常用类介绍
- PHAsset:代表照片库中的一个资源,普通图片、livephoto或者视频
- PHFetchOptions:获取资源时的参数
- PHFetchResult:表示一系列的资源集合,也可以是相册的集合也可以是照片的集合
- PHAssetCollection:表示一个相册
- PHImageManager:用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
- PHImageRequestOptions:加载图片是的参数
二、基本使用
做一个图片选择的思路:获取权限—列出所有相册—列出相册中的图片
使用时需要导入Photos/Photos.h
获取访问图片库的权限
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
//PHAuthorizationStatusNotDetermined 还没有决定是同意还是拒绝
//PHAuthorizationStatusRestricted 没有权限访问,这个用户需要在系统设置里更改
//PHAuthorizationStatusDenied 用户拒绝访问
//PHAuthorizationStatusAuthorized 已经授权可以访问相册
if(status != PHAuthorizationStatusAuthorized){
//使用类方法获取权限
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if(status == PHAuthorizationStatusAuthorized){
//同意访问,继续下一步
}else{
//拒绝访问,做出相应操作
}
}];
}else{
//已经有权限,继续下一步
}
直接获取获取所有照片
//创建一个筛选条件,只需要图片类型,然后按时间倒序排列
PHFetchOptions *option = [[PHFetchOptions alloc] init];
option.predicate = [NSPredicate predicateWithFormat:@"self.mediaType==1"];
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
//获取所有图片,PHFetchResult在这里是照片的集合
PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];
获取相册
获取相册需要使用PHAssetCollection的类方法
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
//PHAssetCollectionType 相册类型
//PHAssetCollectionTypeAlbum 用户创建的相册还有一个包含所有照片的相册,基本都用这个
//PHAssetCollectionTypeSmartAlbum 系统给分类的智能相册,有很多基本很少用
//PHAssetCollectionTypeMoment 以时刻分类的相册
//PHAssetCollectionSubtype 相册子类型,这个一般都用PHAssetCollectionSubtypeAny,如果有特别需求可以自行看文档选择
//获取相册的集合,PHFetchResult在这里是相册的集合
PHFetchResult *albumResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
获取相册里的照片集合
//这里是接着上面获取相册来的
//遍历循环相册集合
for(PHAssetCollection *collection in albumResult){
//通过PHAsset的类方法获取相册里的资源,这里的option条件是只要照片
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:option];
}
获取照片资源
PHCachingImageManager *manager = [[PHCachingImageManager alloc] init];
for(PHAsset *asset in result){
[manager requestImageForAsset:asset targetSize:CGSizeMake(_imageScale, _imageScale) contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
if([cell.imageIdentifier isEqualToString:asset.localIdentifier]){
cell.imageView.image = result;
}
}];
}
//targetSize 这个不要太大,一般根据你需要显示的尺寸的2倍就够了,再大的话内存不够容易崩溃
注:PHCachingImageManager为PHImageManager的子类,该类加载图片时使用了缓存机制,也可是使用该方法提前缓存图片
坑:如果使用上述代码加载的话,返回图片尺寸并不是你想要的尺寸,这是因为没有设置opiton参数,系统会以效率最高的方式加载图片,如果想要返回准确的尺寸图片请参考下面的代码
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.resizeMode = PHImageRequestOptionsResizeModeExact;
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
[_imageManager requestImageForAsset:asset targetSize:CGSizeMake(kWindowWidth*2, kWindowHeight*2) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
}];
小结:这里只是介绍了我项目中需要用到的东西,应该能满足大部分需要,当然还有好多保存图片之类的功能没有介绍,各位可以查看官方文档,如有错误的地方请指出