美文网首页iOS菜鸟级开发iOS
获取系统相册的所有照片

获取系统相册的所有照片

作者: InitWithYou | 来源:发表于2016-10-10 15:18 被阅读1943次

    首先在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:如果对您有帮助请给个赞,万分感谢。

    相关文章

      网友评论

        本文标题:获取系统相册的所有照片

        本文链接:https://www.haomeiwen.com/subject/hztvyttx.html