將一張圖片添加到自定義相冊分為三步
第一步.添加圖片到【相機膠卷】(三種方法)
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