您的位置:首页 - 教程 - IOS - 正文
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.添加图片到相机胶卷相册

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

2.获得自定义相册

 - (PHAssetCollection *)createdCollection
 {
     // 获取软件的名字作为相册的标题
     NSString *title = [NSBundle mainBundle].infoDictionary[(NSString *)kCFBundleNameKey];
     
     // 获得所有的自定义相册
     PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
     for (PHAssetCollection *collection in collections) {
         if ([collection.localizedTitle isEqualToString:title]) {
             return collection;
         }
     }
     
     // 代码执行到这里,说明还没有自定义相册
     
     __block NSString *createdCollectionId = nil;
     
     // 创建一个新的相册
     [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
         createdCollectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
     } error:nil];
     
     if (createdCollectionId == nil) return nil;
     
     // 创建完毕后再取出相册
     return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionId] options:nil].firstObject;
 }

 

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

 - (void)saveImageIntoAlbum
 {
     // 执行步骤1 获得相片
     PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;
     
     // 执行步骤2.获得自定义相册
     PHAssetCollection *createdCollection = self.createdCollection;
     
     if (createdAssets == nil || createdCollection == nil) {
         [SVProgressHUD showErrorWithStatus:@"保存失败!"];
         return;
     }
     
     // 将相片添加到相册
     NSError *error = nil;
     [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
         PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];
         [request insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];
     } error:&error];
     
     // 保存结果
     if (error) {
         [SVProgressHUD showErrorWithStatus:@"保存失败!"];
     } else {
         [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
     }
 }


补充:requestAuthorization方法

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

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

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

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


评论: