http://segmentfault.com/a/1190000003950935

平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷,
也可以自定义相册保存图片,下面我们就一起来看一看.

保存图片到系统相册

先看看比较简单的直接保存图片到系统相册操作

- (IBAction)save {// 存储图片到"相机胶卷"UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}// 成功保存图片到相册中, 必须调用此方法, 否则会报参数越界错误
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{if (error) {[SVProgressHUD showErrorWithStatus:@"保存失败"];[SVProgressHUD showSuccessWithStatus:@"保存成功"];}
}

保存图片到自定义相册

  • 以前我们利用 AssetsLibrary框架 来进行相册的相关操作,但是AssetsLibrary坑太多,一不小心就是各种警告错误,这人非常难受,苹果似乎也意识到了问题的严重性,所以从iOS8开始搞了个 Photos框架 来给我们用.

  • iOS已经更新到了9.0, AssetsLibrary 被完全弃用,下面我们就用 Photos 来做保存图片到自定义相册的操作

#import <AssetsLibrary/AssetsLibrary.h> // iOS9.0彻底弃用,用下面这个吧,拿出来只是提醒你一下
#import <Photos/Photos.h> // iOS8.0开始,我们最好用这个咯- (IBAction)save {// 0.判断状态PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];if (status == PHAuthorizationStatusDenied) {BSLog(@"用户拒绝当前应用访问相册,我们需要提醒用户打开访问开关");}else if (status == PHAuthorizationStatusRestricted){BSLog(@"家长控制,不允许访问");}else if (status == PHAuthorizationStatusNotDetermined){BSLog(@"用户还没有做出选择");[self saveImage];}else if (status == PHAuthorizationStatusAuthorized){BSLog(@"用户允许当前应用访问相册");[self saveImage];}
}/***  返回相册*/
- (PHAssetCollection *)collection{// 先获得之前创建过的相册PHFetchResult<PHAssetCollection *> *collectionResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];for (PHAssetCollection *collection in collectionResult) {if ([collection.localizedTitle isEqualToString:BSCollectionName]) {return collection;}}// 如果相册不存在,就创建新的相册(文件夹)__block NSString *collectionId = nil; // __block修改block外部的变量的值// 这个方法会在相册创建完毕后才会返回[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{// 新建一个PHAssertCollectionChangeRequest对象, 用来创建一个新的相册collectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:BSCollectionName].placeholderForCreatedAssetCollection.localIdentifier;} error:nil];return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionId] options:nil].firstObject;
}/***  返回相册,避免重复创建相册引起不必要的错误*/
- (void)saveImage{/*PHAsset : 一个PHAsset对象就代表一个资源文件,比如一张图片PHAssetCollection : 一个PHAssetCollection对象就代表一个相册*/__block NSString *assetId = nil;// 1. 存储图片到"相机胶卷"[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ // 这个block里保存一些"修改"性质的代码// 新建一个PHAssetCreationRequest对象, 保存图片到"相机胶卷"// 返回PHAsset(图片)的字符串标识assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;} completionHandler:^(BOOL success, NSError * _Nullable error) {if (error) {BSLog(@"保存图片到相机胶卷中失败");return;}BSLog(@"成功保存图片到相机胶卷中");// 2. 获得相册对象PHAssetCollection *collection = [self collection];// 3. 将“相机胶卷”中的图片添加到新的相册[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection];// 根据唯一标示获得相片对象PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil].firstObject;// 添加图片到相册中[request addAssets:@[asset]];} completionHandler:^(BOOL success, NSError * _Nullable error) {if (error) {BSLog(@"添加图片到相册中失败");return;}BSLog(@"成功添加图片到相册中");[[NSOperationQueue mainQueue] addOperationWithBlock:^{[SVProgressHUD showSuccessWithStatus:@"保存成功"];}];}];}];
}

代码比较琐碎,其实在开发的时候直接将上面代码拷进项目稍微改一改就可以了,所以记得收藏哦!!

iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解一相关推荐

  1. iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解三

    http://blog.csdn.net/jerrychenly/article/details/44858355 解决iOS8下ALAssetsLibrary创建相册的bug 说到ALAssetsL ...

  2. ios 保存图片到相册 崩溃_iOS开发之 保存图片到相册(相机胶卷)

    平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷, 也可以自定义相册保存图片,下面我们就一起来看一看. 保存图片到系统相册 先看看比较简单的直接保存图片到系统相 ...

  3. (013)java后台开发之Mac系统安装和配置tomcat步骤详解

    一:下载 打开Apache Tomcat官网,选择需要的版本下载: 二:存放到本地 文件夹重名民为ApacheTomcat,放到/Users/计算机名/Library/目录下 三:启动Tomcat 打 ...

  4. wxpython使用方法_python图形界面开发之wxPython树控件使用方法详解

    wxPython树控件介绍 树(tree)是一种通过层次结构展示信息的控件,如下图所示是树控件示例,左窗口中是树控件,在wxPython中树控件类是wx.TreeCtrl. wx.TreeCtrl常用 ...

  5. java list 元素去重_小猿圈Java开发之list按照元素某个字段去重详解

    小猿圈Java老师给大家分享一篇关于如何实现Java8中list按照元素的某个字段去重的详细介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们一起来看一下吧. ...

  6. Android开发之AudioManager(音频管理器)详解

    AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这 ...

  7. Android开发之GPS测试完整案例源码详解之实时检测GPS的状态

    获取Android系统Location位置服务实例: /*** Get location manager system service** @return LocationManager*/publi ...

  8. java开发之ServLet注解、自定义容器方式详解

    目录 一.为什么使用注解方式和自定义容器方式 二.注解方式步骤 1.创建javaEE8版本的web项目 2.创建一个类MyServlet继承HTTPServlet类并重写doGet()和doPost( ...

  9. 【IoT】STM32 系统级开发之 ucosIII 或 freeRTOS 事件标志组详解

    1.轻型操作系统同步的方案详解 1)信号量 假设有两个任务 Task1 和 Task2,第一个任务进行按键的扫描,第二个任务进行LED灯的点亮 需求: 扫描到按键按下后点亮 LED 灯,也就是说第二个 ...

最新文章

  1. 高校计算机通识教育目标,美国高校计算机通识教育研究
  2. Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()的使用
  3. 4、ShardingSphere 之 Sharding-JDBC 实现垂直分库
  4. mstar v56几路hdmi_Android TV : Mstar平台 GPIO 调试
  5. HDU 2115 -I Love This Game
  6. Regex pattern in openresty
  7. javascript 内存回收机制
  8. 华菱重卡仪表指示说明_仪表装置11种常见故障的解决方法
  9. java犯的小错误_[Java教程]十个JavaScript中易犯的小错误,你中了几枪?
  10. 跟熊浩学沟通30讲读后感_怎样提高自己的沟通表达能力
  11. mysql 删除了授权_mysql用户授权访问与删除授权
  12. 停车还能360全方位影像_2020款新途锐锐享版上市,智能泊车360全景影像加量不加价...
  13. python中in,not in,比较运算符,格式化输出,编码
  14. 2017/12/30 GUI和动态代理
  15. 2008.5调试安装hp dl385 两台hp dl585
  16. 信息学奥赛一本通1364 二叉树遍历
  17. 蓝桥杯 14校4-回文数字  观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。   本题要求你找到一些5位或6位的十进制
  18. 耗时30分钟C++制作象棋程序,网友:优秀啊!
  19. Vue中使用Ckplayer播放器
  20. c语言合并jpg成pdf,JPG在线转换成PDF文件的简单方法

热门文章

  1. DNT论坛整合笔记二
  2. 计算机网络子网划分工具,子网计算划分工具
  3. 计算机词汇意大利语,意大利语电脑词汇
  4. Android Glide加载网络图片不显示,但用网页打开又正常显示
  5. 常用Doss命令+Java工具
  6. WindowService SCHTASKS强制删除计划任务
  7. 详细解析“杨辉三角”
  8. 应用出海,如何使用苹果 CallKit 提升网络通话体验
  9. 第1章 Python机器学习的生态系统
  10. html简易留言,JS实现简易留言板特效