iOS 添加图片到自定义相册

 

将一张图片添加到自定义相册分为三步

第一步.添加图片到【相机胶卷】(三种方法)
 1> UIImageWriteToSavedPhotosAlbum函数(只能添加到【相机胶卷】不推荐)
 2> AssetsLibrary框架(已过期)
 3> Photos框架(推荐)
 
 第二步.拥有一个【自定义相册】(两种方法)
 1> AssetsLibrary框架(已过期)
 2> Photos框架(推荐)
 
 第三步.将刚才添加到【相机胶卷】的图片,引用(添加)到【自定义相册】(两种方法)
 1> AssetsLibrary框架(已过期)
 2> Photos框架(推荐)

 Photos框架须知

 1.PHPhotoLibrary类:代表用户的相片库  

 1.1>对相片的增删改操作必须要使用这个类的对象方法

                                                                                                                                                                          
 2.PHAsset : 一个PHAsset对象代表一张图片或者一个视频文件
 2.1> 负责查询一堆的PHAsset对象


 3.PHAssetCollection : 一个PHAssetCollection对象代表一个相册
 3.1> 负责查询一堆的PHAssetCollection对象
 
 4.PHAssetChangeRequest
 4.1> 负责执行对PHAsset的【增删改】操作
 4.2> 这个类只能放在-[PHPhotoLibrary performChanges:completionHandler:] 或者 -[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
 
 5.PHAssetCollectionChangeRequest
 5.1> 负责执行对PHAssetCollection的【增删改】操作
 5.2> 这个类只能放在-[PHPhotoLibrary performChanges:completionHandler:] 或者 -[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用

下面我们将使用Photos框架实现此功能

 

1.添加图片到相机胶卷相册

 1 - (PHFetchResult<PHAsset *> *)createdAssets
 2 {
 3     __block NSString *createdAssetId = nil;
 4     
 5     // 添加图片到【相机胶卷】
 6     [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
 7         createdAssetId = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
 8     } error:nil];
 9     
10     if (createdAssetId == nil) return nil;
11     
12     // 在保存完毕后取出图片
13     return [PHAsset fetchAssetsWithLocalIdentifiers:@[createdAssetId] options:nil];
14 }

2.获得自定义相册

 1 - (PHAssetCollection *)createdCollection
 2 {
 3     // 获取软件的名字作为相册的标题
 4     NSString *title = [NSBundle mainBundle].infoDictionary[(NSString *)kCFBundleNameKey];
 5     
 6     // 获得所有的自定义相册
 7     PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
 8     for (PHAssetCollection *collection in collections) {
 9         if ([collection.localizedTitle isEqualToString:title]) {
10             return collection;
11         }
12     }
13     
14     // 代码执行到这里,说明还没有自定义相册
15     
16     __block NSString *createdCollectionId = nil;
17     
18     // 创建一个新的相册
19     [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
20         createdCollectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
21     } error:nil];
22     
23     if (createdCollectionId == nil) return nil;
24     
25     // 创建完毕后再取出相册
26     return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionId] options:nil].firstObject;
27 }

 

3.将相机胶卷相册的图片引用到自定义相册

 1 - (void)saveImageIntoAlbum
 2 {
 3     // 执行步骤1 获得相片
 4     PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;
 5     
 6     // 执行步骤2.获得自定义相册
 7     PHAssetCollection *createdCollection = self.createdCollection;
 8     
 9     if (createdAssets == nil || createdCollection == nil) {
10         [SVProgressHUD showErrorWithStatus:@"保存失败!"];
11         return;
12     }
13     
14     // 将相片添加到相册
15     NSError *error = nil;
16     [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
17         PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];
18         [request insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];
19     } error:&error];
20     
21     // 保存结果
22     if (error) {
23         [SVProgressHUD showErrorWithStatus:@"保存失败!"];
24     } else {
25         [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
26     }
27 }


补充:requestAuthorization方法

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    }];

1.如果用户还没有做过选择,这个方法就会弹框让用户做出选择是否允许访问相册

1.1 用户做出选择以后才会回调block

2.如果用户之前已经做过选择,这个方法就不会再弹框,直接回调block,传递现在的授权状态给block

posted @ 2016-04-19 19:07  ll烨  阅读(1952)  评论(0)    收藏  举报