iOS保存圖片到自定義相冊

前言

在開發中一個app有經常保存圖片之類的操作的話, 一般都會創建一個單獨保存自己app圖片的相冊,這樣分類就比較清晰, 用戶也不用去所有照片這里面去一直找自己保存的圖片 .?

iOS9以前用的是<AssetsLibrary/AssetsLibrary.h>這個框架來實現對相冊的操作 , 但這個方法在ios9蘋果開始就廢棄了 . 用<Photos/Photos.h>這個框架來替代 ?

正文

#import <Photos/Photos.h> ? ?// iOS9開始推薦

static NSString * GJAssetCollectionTitle = @"項目名稱"; //定義一個相冊名的全局變量

比如點擊保存按鈕調用save方法 .

- (viod)save {

/*

PHAuthorizationStatusNotDetermined, ??? 用戶還沒有做出選擇

PHAuthorizationStatusDenied,??????????? 用戶拒絕當前應用訪問相冊(用戶當初點擊了"不允許")

PHAuthorizationStatusAuthorized ??????? 用戶允許當前應用訪問相冊(用戶當初點擊了"好")

PHAuthorizationStatusRestricted,??????? 因為家長控制, 導致應用無法方法相冊(跟用戶的選擇沒有關系)

*/

// 判斷授權狀態

PHAuthorizationStatus ?status = [PHPhotoLibrary ?authorizationStatus];

if(status == PHAuthorizationStatusRestricted) {// 因為家長控制, 導致應用無法方法相冊(跟用戶的選擇沒有關系)

[SVProgressHUD showErrorWithStatus:@"因為系統原因, 無法訪問相冊"];

}elseif(status == PHAuthorizationStatusDenied) {// 用戶拒絕當前應用訪問相冊(用戶當初點擊了"不允許")

NSLog(@"提醒用戶去[設置-隱私-照片-xxx]打開訪問開關");

}else if(status == PHAuthorizationStatusAuthorized) {// 用戶允許當前應用訪問相冊(用戶當初點擊了"好")

[self saveImage];

}else if(status == PHAuthorizationStatusNotDetermined) {// 用戶還沒有做出選擇

// 彈框請求用戶授權

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

if(status == PHAuthorizationStatusAuthorized) {// 用戶點擊了好

[self saveImage];

? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? }];

? ? ?}

}

/** 保存圖片 */

- (void)saveImage

{

// PHAsset : 一個資源, 比如一張圖片\一段視頻

// PHAssetCollection : 一個相簿

// PHAsset的標識, 利用這個標識可以找到對應的PHAsset對象(圖片對象)

__blockNSString *assetLocalIdentifier =nil;

// 如果想對"相冊"進行修改(增刪改), 那么修改代碼必須放在[PHPhotoLibrary sharedPhotoLibrary]的performChanges方法的block中

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

// 1.保存圖片A到"相機膠卷"中

// 創建圖片的請求

assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;

} completionHandler:^(BOOLsuccess, NSError *_Nullableerror) {

if(success ==NO) {

[self showError:@"保存圖片失敗!"];

return;

}

// 2.獲得相簿

PHAssetCollection *createdAssetCollection = [self createdAssetCollection];

if(createdAssetCollection ==nil) {

[self showError:@"創建相簿失敗!"];

return;

}

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

// 3.添加"相機膠卷"中的圖片A到"相簿"D中

// 獲得圖片

PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier]options:nil].lastObject;

// 添加圖片到相簿中的請求

PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];

// 添加圖片到相簿

[request addAssets:@[asset]];

} completionHandler:^(BOOLsuccess, NSError *_Nullableerror) {

if(success ==NO) {

[self showError:@"保存圖片失敗!"];;

}else{

[self showSuccess:@"保存圖片成功!"];;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? }];

? ? ?}];

}

/**

*? 獲得相簿

*/

- (PHAssetCollection *)createdAssetCollection

{

// 從已存在相簿中查找這個應用對應的相簿

PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

for(PHAssetCollection *assetCollectioninassetCollections) {

if([assetCollection.localizedTitle isEqualToString:GJAssetCollectionTitle]) {

returnassetCollection;

}

}

// 沒有找到對應的相簿, 得創建新的相簿

// 錯誤信息

NSError *error =nil;

// PHAssetCollection的標識, 利用這個標識可以找到對應的PHAssetCollection對象(相簿對象)

__blockNSString *assetCollectionLocalIdentifier =nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 創建相簿的請求

assetCollectionLocalIdentifier = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:GJAssetCollectionTitle].placeholderForCreatedAssetCollection.localIdentifier;

} error:&error];

// 如果有錯誤信息

if(error)returnnil;

// 獲得剛才創建的相簿

return[PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier]options:nil].lastObject;

}

- (void)showSuccess:(NSString *)text

{

//由于上面的函數都是在子線程中運行 , 所以提醒的代碼要回到主線程刷新UI

dispatch_async(dispatch_get_main_queue(), ^{

[SVProgressHUD showSuccessWithStatus:text];

});

}

- (void)showError:(NSString *)text

{

dispatch_async(dispatch_get_main_queue(), ^{

[SVProgressHUD showErrorWithStatus:text];

});

}

結尾

這樣寫完之后,就會在用戶手機的相簿中創建了一個以你app命名的相冊了, 以后用戶通過你app保存的圖片都會保存在這個相冊里了 , iOS9之后的方法代碼確實有些繁瑣, 很多Block . 這中方式方便了以后蘋果的擴展性 . 而且都是在子線程中進行 .

第一次寫簡書 , 有什么不對的地方或寫的不好的地方歡迎大家指出 , 共同學習 !

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容