為什么要調(diào)用系統(tǒng)相冊
現(xiàn)在很多項(xiàng)目都會用到調(diào)用系統(tǒng)相冊,例如保存圖片到系統(tǒng)相冊都毒、選取相冊中的圖片、給聯(lián)系人設(shè)置頭像碰缔、聊天時(shí)給好友發(fā)送照片等账劲。下面就看下如何調(diào)取系統(tǒng)相冊:
讀取方式
*讀取一張圖片
- 我們可以利用UIImagePickerController這個(gè)類來完成,代碼比較簡單如下所示
- 遵守<UIImagePickerControllerDelegate,UINavigationControllerDelegate>這兩個(gè)協(xié)議
//獲取單張圖片
- (IBAction)fetchSinglePicture:(id)sender {
//創(chuàng)建UIImagePickerController
UIImagePickerController *pickVC = [[UIImagePickerController alloc] init];
//設(shè)置圖片源類型
pickVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //取出所有圖片資源的相簿
//設(shè)置代理
pickVC.delegate = self;
[self presentViewController:pickVC animated:YES completion:nil];
}
*要執(zhí)行的代理方法
#pragma mark------- UIImagePickerControllerDelegate
/**
* 選擇完畢執(zhí)行的方法
*
* @param picker 模態(tài)出的控制器
* @param info 含有圖片信息的字典
*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
//dismiss
[picker dismissViewControllerAnimated:YES completion:nil];
//取出選中的圖片
self.imageView.image = info[UIImagePickerControllerOriginalImage];
}
- 效果圖如下
11.gif
- 獲取多張圖
- 需要導(dǎo)入#import <Photos/Photos.h>
- 9.0之前#import<AssetsLibrary/AssetsLibrary.h>這個(gè)類
- 9.0之后推薦蘋果官方推薦使用#import <Photos/Photos.h> 我是用了一個(gè)集合視圖用來展示效果,并沒有寫選擇功能,只是單純演示
//獲取相機(jī)膠卷所有圖片
- (void)fetchImages {
//獲取相機(jī)膠卷所有圖片
PHFetchResult *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
//遍歷
for (PHAsset *asset in assets) {
//取出圖片
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
[self.imagesArray addObject:result];
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
}];
}
}
-
- 效果如下
22.gif
Photos框架簡單介紹下
- 蘋果自帶的框架,Photos框架須知
1.
PHAsset
: 一個(gè)PHAsset對象代表一張圖片或者一個(gè)視頻文件
- 負(fù)責(zé)查詢一堆的PHAsset對象
2.
PHAssetCollection
: 一個(gè)PHAssetCollection對象代表一個(gè)相冊
- 負(fù)責(zé)查詢一堆的PHAssetCollection對象
3.
PHAssetChangeRequest
- 負(fù)責(zé)執(zhí)行對PHAsset的【增刪改】操作
- 這個(gè)類方法只能放在
-[PHPhotoLibrary performChanges:completionHandler:]或者
-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
4.
PHAssetCollectionChangeRequest
- 負(fù)責(zé)執(zhí)行對PHAssetCollection的【增刪改】操作
- 這個(gè)方法類只能放在
-[PHPhotoLibrary performChanges:completionHandler:] 或者
-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
當(dāng)然也可以讀取相簿 這里方法和讀取相機(jī)膠卷的步驟基本相同
圖片保存系統(tǒng)相機(jī)膠卷
- 方式一:
// UIImageWriteToSavedPhotosAlbum 這個(gè)方法,默認(rèn)保存到系統(tǒng)相機(jī)膠卷,但是@selector后面的方法 必須是這種格式: - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
//保存圖片到系統(tǒng)相冊
UIImageWriteToSavedPhotosAlbum( self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
/**
* 寫入圖片后執(zhí)行的操作
*
* @param image 寫入的圖片
* @param error 錯(cuò)誤信息
* @param contextInfo UIImageWriteToSavedPhotosAlbum第三個(gè)參數(shù)
*/
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
if (error) {
NSLog(@"保存失敗");
}
else {
NSLog(@"保存成功");
}
- 方式二:
- 注意點(diǎn): PHAssetChangeRequest 的方法
必須在-[PHPhotoLibrary performChanges:completionHandler:]
或者-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
- (void)saveImage {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//1,保存圖片到系統(tǒng)相冊
[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) return ;
NSLog(@"保存成功");
}];
}
添加自定義相簿到系統(tǒng)相冊中
- 我這里添加一個(gè)叫ZKQTitle的相簿
- (void)saveImage {
//圖片的本地標(biāo)識符
__block NSString *assetIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//1,保存圖片到系統(tǒng)相冊
assetIdentifier = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) return ;
//2,獲取相簿
PHAssetCollection *assetCollection = [self assetCollection];
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//3,添加照片
//獲取圖片
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetIdentifier] options:nil].firstObject;
//添加圖片的請求
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
//添加圖片
[request addAssets:@[asset]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) return;
NSLog(@"保存成功");
}];
}];
}
/**
* 獲取相簿
*
* @return 獲取到的相簿
*/
- (PHAssetCollection *)assetCollection {
//獲取所有相簿
PHFetchResult *reult = [PHAssetCollection fetchAssetCollectionsWithType:(PHAssetCollectionTypeAlbum) subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
//遍歷所有相簿查找名字叫做 ZKQtitle的相簿
for (PHAssetCollection *collection in reult) {
//如果有 返回
if ([collection.localizedTitle isEqualToString:ZKQtitle]) {
return collection;
}
}
//沒有則創(chuàng)建
//相簿的本地標(biāo)識符
__block NSString *collectionIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//獲取相簿本地標(biāo)識符
collectionIdentifier= [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:ZKQtitle].placeholderForCreatedAssetCollection.localIdentifier;
} error:nil];
return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionIdentifier] options:nil].firstObject;
}
- 效果如下
33.gif
總結(jié)
就簡單介紹這么多,代碼步驟的注釋還是很清楚的.具體使用還是很簡單的,官方文檔很簡單,如有疑問請留言,覺得不錯(cuò),請點(diǎn)擊喜歡,關(guān)注我!!!!,另外有什么問題,請留言~~~~~