为什么要调用系统相册
现在很多项目都会用到调用系统相册,例如保存图片到系统相册、选取相册中的图片、给联系人设置头像、聊天时给好友发送照片等。下面就看下如何调取系统相册:
读取方式
*读取一张图片
- 我们可以利用UIImagePickerController这个类来完成,代码比较简单如下所示
- 遵守<UIImagePickerControllerDelegate,UINavigationControllerDelegate>这两个协议
//获取单张图片
- (IBAction)fetchSinglePicture:(id)sender {
//创建UIImagePickerController
UIImagePickerController *pickVC = [[UIImagePickerController alloc] init];
//设置图片源类型
pickVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //取出所有图片资源的相簿
//设置代理
pickVC.delegate = self;
[self presentViewController:pickVC animated:YES completion:nil];
}
*要执行的代理方法
#pragma mark------- UIImagePickerControllerDelegate
/**
* 选择完毕执行的方法
*
* @param picker 模态出的控制器
* @param info 含有图片信息的字典
*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
//dismiss
[picker dismissViewControllerAnimated:YES completion:nil];
//取出选中的图片
self.imageView.image = info[UIImagePickerControllerOriginalImage];
}
- 效果图如下
- 获取多张图
- 需要导入#import <Photos/Photos.h>
- 9.0之前#import<AssetsLibrary/AssetsLibrary.h>这个类
- 9.0之后推荐苹果官方推荐使用#import <Photos/Photos.h> 我是用了一个集合视图用来展示效果,并没有写选择功能,只是单纯演示
//获取相机胶卷所有图片
- (void)fetchImages {
//获取相机胶卷所有图片
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];
});
}];
}
}
-
- 效果如下
Photos框架简单介绍下
- 苹果自带的框架,Photos框架须知
1.
PHAsset
: 一个PHAsset对象代表一张图片或者一个视频文件
- 负责查询一堆的PHAsset对象
2.
PHAssetCollection
: 一个PHAssetCollection对象代表一个相册
- 负责查询一堆的PHAssetCollection对象
3.
PHAssetChangeRequest
- 负责执行对PHAsset的【增删改】操作
- 这个类方法只能放在
-[PHPhotoLibrary performChanges:completionHandler:]或者
-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
4.
PHAssetCollectionChangeRequest
- 负责执行对PHAssetCollection的【增删改】操作
- 这个方法类只能放在
-[PHPhotoLibrary performChanges:completionHandler:] 或者
-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
当然也可以读取相簿 这里方法和读取相机胶卷的步骤基本相同
图片保存系统相机胶卷
- 方式一:
// UIImageWriteToSavedPhotosAlbum 这个方法,默认保存到系统相机胶卷,但是@selector后面的方法 必须是这种格式: - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
//保存图片到系统相册
UIImageWriteToSavedPhotosAlbum( self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
/**
* 写入图片后执行的操作
*
* @param image 写入的图片
* @param error 错误信息
* @param contextInfo UIImageWriteToSavedPhotosAlbum第三个参数
*/
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
if (error) {
NSLog(@"保存失败");
}
else {
NSLog(@"保存成功");
}
- 方式二:
- 注意点: PHAssetChangeRequest 的方法
必须在-[PHPhotoLibrary performChanges:completionHandler:]
或者-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用
- (void)saveImage {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//1,保存图片到系统相册
[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) return ;
NSLog(@"保存成功");
}];
}
添加自定义相簿到系统相册中
- 我这里添加一个叫ZKQTitle的相簿
- (void)saveImage {
//图片的本地标识符
__block NSString *assetIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//1,保存图片到系统相册
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;
}
}
//没有则创建
//相簿的本地标识符
__block NSString *collectionIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//获取相簿本地标识符
collectionIdentifier= [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:ZKQtitle].placeholderForCreatedAssetCollection.localIdentifier;
} error:nil];
return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionIdentifier] options:nil].firstObject;
}
- 效果如下
总结
就简单介绍这么多,代码步骤的注释还是很清楚的.具体使用还是很简单的,官方文档很简单,如有疑问请留言,觉得不错,请点击喜欢,关注我!!!!,另外有什么问题,请留言~~~~~