iOS開發(fā)中一行代碼解決保存圖片到自定義相簿中


1 .導入#import "SavePhotosTool.h"到項目的目錄中

配置info.plist文件.png
自定義相簿.png
//
//  ViewController.m
//  保存圖片到自定義相簿中
//
//  Created by 徐流洋 on 2017/6/21.
//  Copyright ? 2017年 南京南大尚誠軟件科技有限公司. All rights reserved.
//

#import "ViewController.h"

#import "SavePhotosTool.h"
@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)saveBtnClick:(id)sender {
//先判斷授權的狀態(tài)/傳入圖片
    [SavePhotosTool judgePHAuthorizationStatus:self.imageView.image];
}
@end

以下是工具類的.h文件

//
//  SavePhotosTool.h
//  保存圖片到自定義相簿中
//
//  Created by 徐流洋 on 2017/6/21.
//  Copyright ? 2017年 南京南大尚誠軟件科技有限公司. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <Photos/Photos.h>

@interface SavePhotosTool : NSObject

/** 單例模式 */
+ (instancetype)shareManager;

/** 判斷授權狀態(tài) */
+ (void)judgePHAuthorizationStatus:(UIImage *)image;

@end

以下是工具類的.m文件

//
//  SavePhotosTool.m
//  保存圖片到自定義相簿中
//
//  Created by 徐流洋 on 2017/6/21.
//  Copyright ? 2017年 南京南大尚誠軟件科技有限公司. All rights reserved.
//

#import "SavePhotosTool.h"

@implementation SavePhotosTool

static SavePhotosTool *share;

+ (instancetype)shareManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        share = [SavePhotosTool new];
    });
    return share;
}

+ (void)judgePHAuthorizationStatus:(UIImage *)image{
    [self.shareManager judgePHAuthorizationStatus:image];
}

- (void)judgePHAuthorizationStatus:(UIImage *)image{
    
    //        PHAuthorizationStatusNotDetermined = 0,    用戶還沒有做出選擇
    //        PHAuthorizationStatusDenied,               用戶拒絕當前應用訪問相冊(用戶當初點擊了“不允許”)
    //        PHAuthorizationStatusAuthorized            用戶允許當前應用訪問相冊(用戶當初點擊了“好”)
    //        PHAuthorizationStatusRestricted,           因為家長控制,導致應用無法訪問相冊(跟用戶的選擇沒有關系)
    
    //0.判斷授權狀態(tài)
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    if (status == PHAuthorizationStatusRestricted) {         //因為家長控制,導致應用無法訪問相冊(跟用戶的選擇沒有關系)
        NSLog(@"因為系統(tǒng)原因,無法訪問相冊");
    }else if (status == PHAuthorizationStatusDenied){        //用戶拒絕當前應用訪問相冊(用戶當初點擊了“不允許”)
        NSLog(@"提醒用戶去用戶 [設置-隱私-照片-xxx]打開訪問開關");
    }else if (status == PHAuthorizationStatusAuthorized){    //用戶允許當前應用訪問相冊(用戶當初點擊了“好”)
        [self saveImage:image];
    }else if (status == PHAuthorizationStatusNotDetermined){ //用戶還沒有做出選擇
        //彈框請求用戶授權
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status == PHAuthorizationStatusAuthorized) { //用戶點擊了好
                [self saveImage:image];
            }
        }];
    }
}

- (void)saveImage:(UIImage *)image{
    
    //PHAsset:一個資源,比如:一張圖片/一段視頻
    //PHAssectCollection:一個相簿
    
    //如果想對“相冊”進行修改(增刪改),那么修改代碼必須放在[PHPhotoLibrary sharedPhotoLibrary] 的performChanges方法的block中
    
    //PHAsset的標識,利用這個標識可以找到對應的PHAsset對象(圖片對象)
    __block NSString *assetLocalIdentifier = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        //1.保存圖片A到“相機膠卷”
        //創(chuàng)建圖片的請求
        assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier;
    }completionHandler:^(BOOL success, NSError * _Nullable error) {
        if (success == NO) {
            [self showError:@"保存圖片到【相機膠卷】中失敗"];
            return ;
        }
        //2.獲得相簿
        PHAssetCollection *createAssetCollection = [self createAssetCollection];
        if (createAssetCollection == nil) {
            [self showError:@"創(chuàng)建相簿失??!"];
            return;
        }
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            //3.添加剛保存到“相機膠卷”中的圖片,到“相簿”中
            //獲得圖片
            PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
            //添加圖片到相簿中的請求
            PHAssetCollectionChangeRequest *request =  [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createAssetCollection];
            //添加圖片到相簿
            [request addAssets:@[asset]];
        }completionHandler:^(BOOL success, NSError * _Nullable error) {
            if (success == NO) {
                [self showError:@"添加圖片到【相簿】失敗"];
                return ;
            }else{
                [self showSuccess:@"成功添加圖片到相簿"];
            }
        }];
    }];
}

/**
 * 獲取相簿
 */
- (PHAssetCollection *)createAssetCollection{
    
    // 從已存在相簿中查找這個應用的相簿
    //1.獲取軟件的名字
    NSString *title =  [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey];;
    PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    for (PHAssetCollection * assetCollection in assetCollections) {
        if ([assetCollection.localizedTitle isEqualToString:title]) {
            return assetCollection;
        }
    }
    
    //沒有找到對應的相簿,需要創(chuàng)建新的相簿
    NSError *error = nil;
    //PHAssetCollection的標識,利用這個標識可以找到對應的PHAssetCollection對象(相簿對象)
    __block NSString *assetCollectionLocalIdentifier = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        //創(chuàng)建“相簿”D
        PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
        PHObjectPlaceholder *placeholder = request.placeholderForCreatedAssetCollection;
        assetCollectionLocalIdentifier = placeholder.localIdentifier;
    } error:&error];
    //如果有錯誤信息
    if (error) return nil;
    //獲得剛才創(chuàng)建的相簿
    return  [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;
}
- (void)showError:(NSString *)text{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%@",text);
        //        [SVProgressHUD showErrorWithStatus:text];
    });
}
- (void)showSuccess:(NSString *)text{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%@",text);
        //        [SVProgressHUD showSuccessWithStatus:text];
    });
}
@end

源碼下載↓
鏈接: https://pan.baidu.com/s/1c2AIVPu 密碼: wv2f

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,365評論 25 708
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,391評論 0 17
  • ¥關閉¥ 【雷霆戰(zhàn)機】 〖http://pan.baidu.com/s/1kVstszX〗 《解壓源碼后直接用AI...
    小菜c閱讀 9,853評論 0 19
  • 若是你來就好了 便再也沒有漫漫長夜 一盞清茶 一本書 相視一笑里 不必傾國傾城 若是遠離世俗就好了 便不用看表演了...
    舒漓閱讀 223評論 0 7
  • 就是幾個月前我媽說我表姐要從老家過來和我住在一個房間。 然后我就開始收拾房間了,我有收藏東西的習慣,說收藏是好聽,...
    小麗你好閱讀 608評論 1 0

友情鏈接更多精彩內容