天天看点

iOS8.0图片PhotoKit笔记

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*, kWindowHeight*) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

}];
           

小结:这里只是介绍了我项目中需要用到的东西,应该能满足大部分需要,当然还有好多保存图片之类的功能没有介绍,各位可以查看官方文档,如有错误的地方请指出