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

浙公网安备 33010602011771号