在市场上主流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:@"保存成功"];

}

}];

}

最新文章

  1. redis配置
  2. 中断处理流程,ok6410
  3. SQL 自动增长 identity
  4. HDU 2682
  5. cocos2d-x触摸事件优先级的探究与实践
  6. BZOJ_1588_&amp;_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)
  7. HDU 5139 Formula 卡内存
  8. FAT下的winhex数据恢复
  9. 10_Segue Example
  10. WCF 内置跟踪日志
  11. DbContext 和ObjectContext
  12. [Treap][学习笔记]
  13. TestNg 4.组测试中的方法分组测试
  14. 让BIND9对任意域名查询都返回固定的IP地址
  15. zgrep用法
  16. js 边写边出现刚写的内容
  17. Spring-全局异常拦截
  18. phalcon分页的处理
  19. xz文件的解压缩
  20. mongodb3.0+ 版本内置数据压缩

热门文章

  1. 使用命令行+ideal 工具实现本地代码项目提交
  2. 移动web端的react.js组件化方案
  3. nginx:文件下载指定保存文件名的配置
  4. kafka的log存储解析——topic的分区partition分段segment以及索引等
  5. javascript--Math相关
  6. myeclipse中source not found问题解决办法
  7. mac 终端常用命令
  8. dubbo 常见错误
  9. C#委托与事件的简单使用
  10. java发送邮件..转