iOS - Photos框架详解(调用系统相册)

人一切的痛苦,本质上都是对自己的无能的愤怒。


1.相册访问权限
2.相册中图片变化的监听
3.读取相册中的图片
4.将图片保存到相册

相册访问权限

使用系统相册的时候,首先判断是否有权限,没有权限的话,可以弹出提示框。

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];  
if (status == PHAuthorizationStatusRestricted ||  
    status == PHAuthorizationStatusDenied) {  
    // 这里便是无访问权限  
    //可以弹出个提示框,叫用户去设置打开相册权限
}  else {
    //这里就是用权限
}

相册中图片变化的监听

相册监听中的回调方法是在 子线程 中的,因此要改变UI布局的话,必须回到主线程

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];    //创建监听者
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];    //移除监听者

//相册变化回调  
- (void)photoLibraryDidChange:(PHChange *)changeInstance  
{  

    dispatch_sync(dispatch_get_main_queue(), ^{  
        //修改UI
    });  

}  

获取相册中的图片

** 几个常用的类 **
**PHAsset **: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源。每个PHAsset就是一张图片的详细信息,包括图片、位置、时间等。

** PHFetchOptions **: 获取资源时的参数,可以传 nil,即使用系统默认值。

** PHFetchResult **: 表示一系列的资源集合,也可以是相册的集合。

** PHAssetCollection **: 表示一个相册或者一个时刻,或者是一个智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等)。

** PHImageManager **: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格。

** PHImageRequestOptions **: 如上面所说,控制加载图片时的一系列参数。

// 获取所有资源的集合,并按资源的创建时间排序
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

//获取相机胶卷所有图片
PHFetchResult *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];

PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];

//设置显示模式
/*
PHImageRequestOptionsResizeModeNone    //选了这个就不会管传如的size了 ,要自己控制图片的大小,建议还是选Fast
PHImageRequestOptionsResizeModeFast    //根据传入的size,迅速加载大小相匹配(略大于或略小于)的图像 
PHImageRequestOptionsResizeModeExact    //精确的加载与传入size相匹配的图像 
*/
option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.synchronous = NO;
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

CGFloat scale = [UIScreen mainScreen].scale;
CGSize screenSize = [UIScreen mainScreen].bounds.size;

typeof(self)weakSelf = self;
for (PHAsset *asset in assets) {
    
    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(screenSize.width*scale, screenSize.height*scale) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        //我这里用个模型接储存了图片的 localIdentifier 和图片本身
        //还有很多信息,根据自己的需求来取
        CellModel * model = [CellModel new];
        model.localIdentifier = asset.localIdentifier;
        model.image = [UIImage imageWithData:UIImageJPEGRepresentation(result, 0.5)];
        
        [weakSelf.cellImageArray addObject:model];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf reloadData];
        });
        
    }];
    
}

将图片保存到相册

  • 方法一:
    • 优点:简单快捷
    • 缺点:无法直接保存到自定义相册
- (IBAction)savePhoto {
    //  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
    //只能保存到相机胶卷(不能保存到自定义相册)
    UIImageWriteToSavedPhotosAlbum(self.Photo.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

//回调判断保存是否成功
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        //保存失败
    }else{
        //保存成功
    }
}
  • ** 方法二: **
    • 优点:能够保存到任何相册
    • 缺点:没有第一种方法简单
 // 添加图片到自己相册
 - (void)savePhoto
 {
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
         // 1.创建图片请求类(创建系统相册中新的图片)PHAssetCreationRequest
         // 把图片放在系统相册
         PHAssetCreationRequest *assetCreationRequest = [PHAssetCreationRequest creationRequestForAssetFromImage:_imageView.image];
        
         // 2.创建相册请求类(修改相册)PHAssetCollectionChangeRequest
         PHAssetCollectionChangeRequest *assetCollectionChangeRequest = nil;
        
         // 获取之前相册
         PHAssetCollection *assetCollection = [self fetchAssetCollection:@"百思不得姐"];
        
         // 判断是否已有相册
         if (assetCollection) {
             // 如果存在已有同名相册   指定这个相册,创建相册请求修改类  
             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
         } else {  //不存在,创建新的相册
             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思不得姐"];
         } 
         // 3.把图片添加到相册中
         // NSFastEnumeration:以后只要看到这个,就可以表示数组
         //assetCreationRequest.placeholderForCreatedAsset 图片请求类占位符(相当于一个内存地址) 
          //因为creationRequestForAssetFromImage方法是异步实行的,在这里不能保证 assetCreationRequest有值
  
         [assetCollectionChangeRequest addAssets:@[assetCreationRequest.placeholderForCreatedAsset]];
  
     } completionHandler:^(BOOL success, NSError * _Nullable error) {
        
         if (success) {
             [SVProgressHUD showSuccessWithStatus:@"保存成功"];
         } else {
             [SVProgressHUD showErrorWithStatus:@"保存失败"];
         }
        
     }];
 }
 
 // 指定相册名称,获取相册
 - (PHAssetCollection *)fetchAssetCollection:(NSString *)title
 {
     // 获取相簿中所有自定义相册
     PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
     遍历相册,判断是否存在同名的相册
     for (PHAssetCollection *assetCollection in result) {
         if ([title isEqualToString:assetCollection.localizedTitle]) {  存在,就返回这个相册
             return assetCollection;
         }
     }  
     return nil;
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容