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

自己最近抽空写了一个相册多选框架,用到对一些对相册相关的操作,使用的便是iOS8.0之后,apple推出的新框架 Photos.framework

github地址:https://github.com/longitachi/ZLPhotoBrowser 喜欢的朋友可以给个star

下载的朋友建议去Git上下载,由于csdn的资源不支持实施更改,git上将持续更新



废话不多说,来干货


以下操作都需要导入<Photos/Photos.h>头文件

1.判断相册访问权限

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];  
  2. if (status == PHAuthorizationStatusRestricted ||  
  3.     status == PHAuthorizationStatusDenied) {  
  4.     // 这里便是无访问权限  
  5. }  

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];  

当然,这个"self"是要遵守  PHPhotoLibraryChangeObserver 协议的

回调方法如下,不过这个地方是有一个坑的,就是这个回调是在一个子线程里面,如果你想要对UI进行操作的话,则必须回调主线程
[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //相册变化回调  
  2. - (void)photoLibraryDidChange:(PHChange *)changeInstance  
  3. {  
  4.     dispatch_sync(dispatch_get_main_queue(), ^{  
  5.         // your codes  
  6.     });  
  7. }  

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

对相册资源的相关操作,apple多都放在了 PHAsset内
[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma mark - 获取相册内所有照片资源  
  2. - (NSArray<PHAsset *> *)getAllAssetInPhotoAblumWithAscending:(BOOL)ascending  
  3. {  
  4.     NSMutableArray<PHAsset *> *assets = [NSMutableArray array];  
  5.       
  6.     PHFetchOptions *option = [[PHFetchOptions alloc] init];  
  7.     //ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列  
  8.     option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];  
  9.       
  10.     PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:option];  
  11.       
  12.     [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {  
  13.         PHAsset *asset = (PHAsset *)obj;  
  14.         NSLog(@"照片名%@", [asset valueForKey:@"filename"]);  
  15.         [assets addObject:asset];  
  16.     }];  
  17.       
  18.     return assets;  
  19. }  


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];  
  2.     //仅显示缩略图,不控制质量显示  
  3.     /** 
  4.      PHImageRequestOptionsResizeModeNone, 
  5.      PHImageRequestOptionsResizeModeFast, //根据传入的size,迅速加载大小相匹配(略大于或略小于)的图像 
  6.      PHImageRequestOptionsResizeModeExact //精确的加载与传入size相匹配的图像 
  7.      */  
  8.     option.resizeMode = PHImageRequestOptionsResizeModeFast;  
  9.     option.networkAccessAllowed = YES;  
  10.     //param:targetSize 即你想要的图片尺寸,若想要原尺寸则可输入PHImageManagerMaximumSize  
  11.     [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {  
  12.         //解析出来的图片  
  13.     }];  


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];  
  2. [smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOLBOOL *stop) {  
  3.     NSLog(@"相册名字:%@", collection.localizedTitle);  
  4. }];  



智能相册的title不出意外都是英文,下面提供一个对应的中文名
[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. - (NSString *)transformAblumTitle:(NSString *)title  
  2. {  
  3.     if ([title isEqualToString:@"Slo-mo"]) {  
  4.         return @"慢动作";  
  5.     } else if ([title isEqualToString:@"Recently Added"]) {  
  6.         return @"最近添加";  
  7.     } else if ([title isEqualToString:@"Favorites"]) {  
  8.         return @"最爱";  
  9.     } else if ([title isEqualToString:@"Recently Deleted"]) {  
  10.         return @"最近删除";  
  11.     } else if ([title isEqualToString:@"Videos"]) {  
  12.         return @"视频";  
  13.     } else if ([title isEqualToString:@"All Photos"]) {  
  14.         return @"所有照片";  
  15.     } else if ([title isEqualToString:@"Selfies"]) {  
  16.         return @"自拍";  
  17.     } else if ([title isEqualToString:@"Screenshots"]) {  
  18.         return @"屏幕快照";  
  19.     } else if ([title isEqualToString:@"Camera Roll"]) {  
  20.         return @"相机胶卷";  
  21.     }  
  22.     return nil;  
  23. }  

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];  
  2. [userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOLBOOL * _Nonnull stop) {  
  3.     NSLog(@"相册名字:%@", collection.localizedTitle);  
  4. }];  


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma mark - 获取指定相册内的所有图片  
  2. - (NSArray<PHAsset *> *)getAssetsInAssetCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending  
  3. {  
  4.     NSMutableArray<PHAsset *> *arr = [NSMutableArray array];  
  5.       
  6.     PHFetchResult *result = [self fetchAssetsInAssetCollection:assetCollection ascending:ascending];  
  7.     [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {  
  8.         [arr addObject:obj];//这个obj即PHAsset对象  
  9.     }];  
  10.     return arr;  
  11. }  


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];  
  2.     option.networkAccessAllowed = NO;  
  3.     option.synchronous = YES;  
  4.       
  5.     __block BOOL isInLocalAblum = YES;  
  6.       
  7.     [[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {  
  8.         isInLocalAblum = imageData ? YES : NO;  
  9.     }];  
  10.     return isInLocalAblum;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值