平時開發APP時不免會遇到保存圖片到相冊的相關操做,具體我麼能夠直接保存到系統的相機膠捲,
也能夠自定義相冊保存圖片,下面咱們就一塊兒來看一看.框架
先看看比較簡單的直接保存圖片到系統相冊操做學習
- (IBAction)save { // 存儲圖片到"相機膠捲" UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } // 成功保存圖片到相冊中, 必須調用此方法, 不然會報參數越界錯誤 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ if (error) { [SVProgressHUD showErrorWithStatus:@"保存失敗"]; [SVProgressHUD showSuccessWithStatus:@"保存成功"]; } }
之前咱們利用 AssetsLibrary框架 來進行相冊的相關操做,可是AssetsLibrary坑太多,一不當心就是各類警告錯誤,這人很是難受,蘋果彷佛也意識到了問題的嚴重性,因此從iOS8開始搞了個 Photos框架 來給咱們用.fetch
iOS已經更新到了9.0, AssetsLibrary 被徹底棄用,下面咱們就用 Photos 來作保存圖片到自定義相冊的操做code
#import <AssetsLibrary/AssetsLibrary.h> // iOS9.0完全棄用,用下面這個吧,拿出來只是提醒你一下 #import <Photos/Photos.h> // iOS8.0開始,咱們最好用這個咯 - (IBAction)save { // 0.判斷狀態 PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus]; if (status == PHAuthorizationStatusDenied) { BSLog(@"用戶拒絕當前應用訪問相冊,咱們須要提醒用戶打開訪問開關"); }else if (status == PHAuthorizationStatusRestricted){ BSLog(@"家長控制,不容許訪問"); }else if (status == PHAuthorizationStatusNotDetermined){ BSLog(@"用戶尚未作出選擇"); [self saveImage]; }else if (status == PHAuthorizationStatusAuthorized){ BSLog(@"用戶容許當前應用訪問相冊"); [self saveImage]; } } /** * 返回相冊 */ - (PHAssetCollection *)collection{ // 先得到以前建立過的相冊 PHFetchResult<PHAssetCollection *> *collectionResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; for (PHAssetCollection *collection in collectionResult) { if ([collection.localizedTitle isEqualToString:BSCollectionName]) { return collection; } } // 若是相冊不存在,就建立新的相冊(文件夾) __block NSString *collectionId = nil; // __block修改block外部的變量的值 // 這個方法會在相冊建立完畢後纔會返回 [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ // 新建一個PHAssertCollectionChangeRequest對象, 用來建立一個新的相冊 collectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:BSCollectionName].placeholderForCreatedAssetCollection.localIdentifier; } error:nil]; return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionId] options:nil].firstObject; } /** * 返回相冊,避免重複建立相冊引發沒必要要的錯誤 */ - (void)saveImage{ /* PHAsset : 一個PHAsset對象就表明一個資源文件,好比一張圖片 PHAssetCollection : 一個PHAssetCollection對象就表明一個相冊 */ __block NSString *assetId = nil; // 1. 存儲圖片到"相機膠捲" [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ // 這個block裏保存一些"修改"性質的代碼 // 新建一個PHAssetCreationRequest對象, 保存圖片到"相機膠捲" // 返回PHAsset(圖片)的字符串標識 assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier; } completionHandler:^(BOOL success, NSError * _Nullable error) { if (error) { BSLog(@"保存圖片到相機膠捲中失敗"); return; } BSLog(@"成功保存圖片到相機膠捲中"); // 2. 得到相冊對象 PHAssetCollection *collection = [self collection]; // 3. 將「相機膠捲」中的圖片添加到新的相冊 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection]; // 根據惟一標示得到相片對象 PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil].firstObject; // 添加圖片到相冊中 [request addAssets:@[asset]]; } completionHandler:^(BOOL success, NSError * _Nullable error) { if (error) { BSLog(@"添加圖片到相冊中失敗"); return; } BSLog(@"成功添加圖片到相冊中"); [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [SVProgressHUD showSuccessWithStatus:@"保存成功"]; }]; }]; }]; }
代碼比較瑣碎,其實在開發的時候直接將上面代碼拷進項目稍微改一改就能夠了,因此記得收藏哦!!orm
更多關於iOS學習開發的文章請登錄個人我的博客www.zhunjiee.com,歡迎前來參觀學習對象