文 || 張賀
一、保存圖片到相機膠卷(Camera Roll)
方法一:利用C語言函數(最快速、最簡單的方法)
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *Photo;
@end
@implementation ViewController
//保存照片到相冊
- (IBAction)savePhoto {
// Adds a photo to the saved photos album. The optional completionSelector should have the form:
// - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
//只能保存到相機膠卷(不能保存到自定義相冊)
UIImageWriteToSavedPhotosAlbum(self.Photo.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
if (error) {
//保存失敗
}else{
//保存成功
}
}
@end
以上代碼運行后程序崩潰。
錯誤信息:
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
意思是需要在Info.plist里面增加NSPhotoLibraryUsageDescription
這個key來詢問用戶是否允許訪問相冊,value為string "我要窺探你的隱私啦~"
方法二:AssetsLibrary框架(iOS9以后廢棄,使用Photos框架替代)
方法三:Photos框架
Photos框架須知:
1、PHAsset
: 一個PHAsset
對象就代表相冊中的一張圖片或者視頻
查 : [PHAsset fetchAsset...]
增刪改 :PHAssetChangeRequest
(包括圖片/視頻相關的所有改動操作)
2、PHAssetCollection
: 一個PHAssetCollection
對象就代表一個相冊
查 : [PHAssetCollection fetchAssetCollections...]
增刪改 :PHAssetCollectionChangeRequest
(包括相冊相關的所有改動操作)
3、對相片/相冊的任何 [增刪改] 操作都必須放到以下兩個block中去執行
-[PHPhotoLibrary performChanges:completionHandler:]
-[PHPhotoLibrary performChangesAndWait:error:]
代碼:
#import "ViewController.h"
#import <Photos/Photos.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *Photo;
@end
@implementation ViewController
//保存照片到相冊
- (IBAction)savePhoto {
//保存照片到相機膠卷
//異步執行修改操作
//PHPhotoLibrary對象就代表著Photos這個應用
[[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
//默認就把相片保存到了相機膠卷
[PHAssetChangeRequest creationRequestForAssetFromImage:self.Photo.image];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (error) {
//保存失敗
}else{
//保存成功
}
}];
NSError *error = nil;
//保存照片到相機膠卷
//同步執行修改操作
[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
//默認就把相片保存到了相機膠卷
[PHAssetChangeRequest creationRequestForAssetFromImage:self.Photo.image];
} error:&error];
if (error) {
//保存失敗
}else{
//保存成功
}
}
@end
二、保存圖片到自定義相冊
第一步:保存圖片到相機膠卷
第二步:擁有一個自定義相冊
方法一:AssetsLibrary框架(iOS9以后廢棄,使用Photos框架替代)
方法二:Photos框架
#import "ViewController.h"
#import <Photos/Photos.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *Photo;
@end
@implementation ViewController
//創建一個自定義相冊
- (IBAction)createdCollection {
//獲取應用的名字
NSString *title = [NSBundle mainBundle].infoDictionary[(NSString *)kCFBundleNameKey];
//抓取所有的自定義相冊(保證相冊只被創建一個)
PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
//查找當前APP對應的自定義相冊
PHAssetCollection *createdCollection = nil;
for (PHAssetCollection *collection in collections) {
if ([collection.localizedTitle isEqualToString:title]) {
createdCollection = collection;
break;
}
}
//當前APP對應的自定義相冊沒有被創建過
if (createdCollection == nil) {
NSError *error = nil;
__block NSString *createdCollectionID;
[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
//創建一個相冊,拿到相冊的唯一標識符
createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
} error:&error];
//根據相冊的唯一標識符拿到相冊
createdCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject;
if (error) {
//保存失敗
}else{
//保存成功
}
}
}
@end
第三步:添加剛才保存的圖片到自定義相冊
方法一:AssetsLibrary框架(iOS9以后廢棄,使用Photos框架替代)
方法二:Photos框架
//保存照片到自定義相冊
- (void)saveImageIntoAlbum{
//保存圖片到相機膠卷
PHFetchResult<PHAsset *> *createdAsset = self.createdAsset;
if (createdAsset == nil) {
//保存照片失敗
return;
}
//獲得相冊
PHAssetCollection *collection = self.createdCollection;
if (collection == nil) {
//創建相冊失敗
return;
}
//把剛才添加到相機膠卷的照片放到自定義相冊
NSError *error = nil;
[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection];
[request insertAssets:createdAsset atIndexes:[NSIndexSet indexSetWithIndex:0]];
} error:&error];
if (error) {
//保存圖片失敗
return;
}
}