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