在市場上主流App中,大多數App都具有存儲圖片到自己App的相冊中.蘋果提供的方法只能存儲圖片到系統相冊,下面講一下怎么實現:
實現思路:
1.對系統相冊進行操作的前提必須導入#import <Photos/Photos.h>
2.在用戶點擊保存之后,首先判斷用戶是否允許App訪問相冊.若不是不可以,提醒用戶需要打開權限.
3.進入用戶相冊之后,首先判斷有沒有改App儲存圖片的相冊,有的話直接把圖片存儲進去,沒有的話創建一個新的相冊.
4.在圖片存儲到相冊的時候用到占位圖片.
具體實現:
// 1.獲取用戶授權狀態,狀態有四種
// 1) PHAuthorizationStatusNotDetermined 不確定
// 2) PHAuthorizationStatusRestricted, 家長控制,拒絕
// 3) PHAuthorizationStatusDenied, 拒絕
// 4) PHAuthorizationStatusAuthorized 授權
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
// 2.判斷用戶的授權狀態
if (status == PHAuthorizationStatusNotDetermined) {
// 如果狀態是不確定的話,block中的內容會等到授權完成再調用
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
// 授權完成就會調用
if (status == PHAuthorizationStatusAuthorized) {
//調用存儲圖片的方法
[self savePhoto];
}
}];
//如果允許訪問
} else if (status == PHAuthorizationStatusAuthorized) {
//調用存儲圖片的方法
[self savePhoto];
//如果權限是拒絕
} else {
// 使用第三方框架,彈出一個頁面提示用戶去打開授權
// [SVProgressHUD showInfoWithStatus:@"進入設置界面->找到當前應用->打開允許訪問相冊開關"];
}
#pragma mark - 該方法獲取在圖庫中是否已經創建該App的相冊
//該方法的作用,獲取系統中所有的相冊,進行遍歷,若是已有相冊,返回該相冊,若是沒有返回nil,參數為需要創建 的相冊名稱
- (PHAssetCollection *)fetchAssetColletion:(NSString *)albumTitle
{
// 獲取所有的相冊
PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
//遍歷相冊數組,是否已創建該相冊
for (PHAssetCollection *assetCollection in result) {
if ([assetCollection.localizedTitle isEqualToString:albumTitle]) {
return assetCollection;
}
}
return nil;
}
#pragma mark - 保存圖片的方法
- (void)savePhoto
{
//修改系統相冊用PHPhotoLibrary單粒,調用performChanges,否則蘋果會報錯,並提醒你使用
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 調用判斷是否已有該名稱相冊
PHAssetCollection *assetCollection = [self fetchAssetColletion:
@"百思"];
//創建一個操作圖庫的對象
PHAssetCollectionChangeRequest *assetCollectionChangeRequest;
if (assetCollection) {
// 已有相冊
assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
} else {
// 1.創建自定義相冊
assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思"];
}
// 2.保存你需要保存的圖片到系統相冊(這里保存的是_imageView上的圖片)
PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:_imageView.image];
// 3.把創建好圖片添加到自己相冊
//這里使用了占位圖片,為什么使用占位圖片呢
//這個block是異步執行的,使用占位圖片先為圖片分配一個內存,等到有圖片的時候,再對內存進行賦值
PHObjectPlaceholder *placeholder = [assetChangeRequest placeholderForCreatedAsset];
[assetCollectionChangeRequest addAssets:@[placeholder]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
//彈出一個界面提醒用戶是否保存成功
if (error) {
//[SVProgressHUD showErrorWithStatus:@"保存失敗"];
} else {
// [SVProgressHUD showSuccessWithStatus:@"保存成功"];
}
}];
}