• iOS8.0 使用Photos.framework对相册的常用操作


    转载自:http://blog.csdn.net/longitachi/article/details/50130957

    1.判断相册访问权限

       首先我们访问相册,肯定有需要判断是否有访问权限的时候,然后做出相应的操作

    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    if (status == PHAuthorizationStatusRestricted ||
        status == PHAuthorizationStatusDenied) {
        // 这里便是无访问权限
    }

    2.实时监听相册内部图片变化

    [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];

    当然,这个"self"是要遵守 PHPhotoLibraryChangeObserver 协议的
     
    回调方法如下,不过这个地方是有一个坑的,就是这个回调是在一个子线程里面,如果你想要对UI进行操作的话,则必须回调主线程
    //相册变化回调
    - (void)photoLibraryDidChange:(PHChange *)changeInstance
    {
        dispatch_sync(dispatch_get_main_queue(), ^{
            // your codes
        });
    }

    3.读取相册内所有图片资源

    对相册资源的相关操作,apple多都放在了 PHAsset内
    #pragma mark - 获取相册内所有照片资源
    - (NSArray<PHAsset *> *)getAllAssetInPhotoAblumWithAscending:(BOOL)ascending
    {
        NSMutableArray<PHAsset *> *assets = [NSMutableArray array];
        
        PHFetchOptions *option = [[PHFetchOptions alloc] init];
        //ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列
        option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
        
        PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:option];
        
        [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            PHAsset *asset = (PHAsset *)obj;
            NSLog(@"照片名%@", [asset valueForKey:@"filename"]);
            [assets addObject:asset];
        }];
        
        return assets;
    }

    4.根据获取的PHAsset对象,解析图片

    PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
        //仅显示缩略图,不控制质量显示
        /**
         PHImageRequestOptionsResizeModeNone,
         PHImageRequestOptionsResizeModeFast, //根据传入的size,迅速加载大小相匹配(略大于或略小于)的图像
         PHImageRequestOptionsResizeModeExact //精确的加载与传入size相匹配的图像
         */
        option.resizeMode = PHImageRequestOptionsResizeModeFast;
        option.networkAccessAllowed = YES;
        //param:targetSize 即你想要的图片尺寸,若想要原尺寸则可输入PHImageManagerMaximumSize
        [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
            //解析出来的图片
        }];

    5.获取所有智能相册(即默认的,如“所有照片”“屏幕快照”等)

    PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    [smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
        NSLog(@"相册名字:%@", collection.localizedTitle);
    }];

    智能相册的title不出意外都是英文,下面提供一个对应的中文名

    - (NSString *)transformAblumTitle:(NSString *)title
    {
        if ([title isEqualToString:@"Slo-mo"]) {
            return @"慢动作";
        } else if ([title isEqualToString:@"Recently Added"]) {
            return @"最近添加";
        } else if ([title isEqualToString:@"Favorites"]) {
            return @"最爱";
        } else if ([title isEqualToString:@"Recently Deleted"]) {
            return @"最近删除";
        } else if ([title isEqualToString:@"Videos"]) {
            return @"视频";
        } else if ([title isEqualToString:@"All Photos"]) {
            return @"所有照片";
        } else if ([title isEqualToString:@"Selfies"]) {
            return @"自拍";
        } else if ([title isEqualToString:@"Screenshots"]) {
            return @"屏幕快照";
        } else if ([title isEqualToString:@"Camera Roll"]) {
            return @"相机胶卷";
        }
        return nil;
    }

    在项目plist配置文件中添加如下键,值设为YES,即可自动匹配手机系统语言,返回相册名字。不需要进行上列判断

    Localized resources can be mixed YES
    //或者右键plist文件Open As->Source Code 添加
    <key>CFBundleAllowMixedLocalizations</key>
    <true/>
    

    6.获取所有用户创建的相册

    PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
    [userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"相册名字:%@", collection.localizedTitle);
    }];
    

    7.获取每个相册下的所有照片对象(PHAsset)

    #pragma mark - 获取指定相册内的所有图片
    - (NSArray<PHAsset *> *)getAssetsInAssetCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
    {
        NSMutableArray<PHAsset *> *arr = [NSMutableArray array];
        
        PHFetchResult *result = [self fetchAssetsInAssetCollection:assetCollection ascending:ascending];
        [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [arr addObject:obj];//这个obj即PHAsset对象
        }];
        return arr;
    }

    8.验证该图片是否在本地(若开启了iCloud照片存储,则图片会定时上传到网上,本地不存在)

    PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
        option.networkAccessAllowed = NO;
        option.synchronous = YES;
        
        __block BOOL isInLocalAblum = YES;
        
        [[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
            isInLocalAblum = imageData ? YES : NO;
        }];
        return isInLocalAblum;
    

     9.获取LivePhoto

    PHLivePhotoRequestOptions *option = [[PHLivePhotoRequestOptions alloc] init];
        option.version = PHImageRequestOptionsVersionCurrent;
        option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
        option.networkAccessAllowed = YES;
        
        [[PHCachingImageManager defaultManager] requestLivePhotoForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:option resultHandler:^(PHLivePhoto * _Nullable livePhoto, NSDictionary * _Nullable info) {
            if (completion) completion(livePhoto, info);
        }];

    10.获取Video

    [[PHCachingImageManager defaultManager] requestPlayerItemForVideo:asset options:nil resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) {
            if (completion) completion(playerItem, info);
        }];
  • 相关阅读:
    JavaScript AMD 模块加载器原理与实现
    nodejs之日志管理
    实时监测每秒上行下行流量,一款 iOS Today Widget 监测器Demo,还可以可以监测内存大小、存储空间等信息
    Swift 2.0基本语法
    【京东助手】滑稽东试用助手 V1.6.0
    我也秀秀windows phone版博客园客户端
    asp.net做的网站账号登陆后注销不管用了
    分享个自己做的CSDN刷下载积分软件
    推荐一个很好用的HTTP操作类
    新软件马上就要完成了,先发篇文章YY下
  • 原文地址:https://www.cnblogs.com/niit-soft-518/p/7857315.html
Copyright © 2020-2023  润新知