来自:http://www.jianshu.com/p/ac18aa3f28c2

最近公司的app有一个新功能是在app中删除相册的照片 ,本来是一个比较简单地功能,在做的过程中却发现AssetsLibary 框架并没有提供删除相册的API,网络上查找的时候这方面的信息也很少,最终在stackoverflow上发现了一个巧妙的方法,使用[ALAsset setImageData:metadata:completionBlock:]来实现删除照片的功能,可是也有人说这个API虽然能删除照片,但是它的主要功能不是用来删除照片,在iOS8的时候再只用它删除照片就无效了。好在iOS8中我们可以直接使用 PhotoKit框架来完成操作,PhotoKit中直接提供了 [PHAssetChangeRequest deleteAssets:@[Asset]]API来完成对照片的删除功能。接下来我们介绍一下这两个照片库框架如何删除照片。

在以前的iOS App中中我们通常用AssetsLibary框架来完成对照片库的操作,但是随着iOS 系统的更新,苹果在相机和照片库上都发生了很大的改变,比如最新的iOS9系统中会有单独的自拍、屏幕快照相册,现在仅仅使用AssetsLibary并不能对照片库进行很好地支持。在iOS8中Apple提供了新的框架 PhotoKit,相比老旧的AssetsLibary,PhotoKit表现的更好,更能完成设备和照片库的无缝工作。但是在现在的苹果用户中,iOS7系统还是占有很大的比例,所以AssetsLibary仍然具有使用意义。

AssetsLibary删除照片(用于iOS7)

1.在相册中添加一张照片

    ALAssetsLibrary *lib = [[ALAssetsLibrary alloc]init];
UIImage *image = [UIImage imageNamed:@"pet"];
[lib writeImageToSavedPhotosAlbum:image.CGImage metadata:@{} completionBlock:^(NSURL *assetURL, NSError *error) {
NSLog(@"Write image(%@) to album . Error:(%@)", assetURL, error);
}];

2.在相册中删除照片

    ALAssetsLibrary *lib = [[ALAssetsLibrary alloc]init];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result.isEditable) {
//在这里imageData 和 metaData设为nil,就可以将相册中的照片删除
[result setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
NSLog(@"asset url(%@) should be delete . Error:%@ ", assetURL, error);
}];
}
}];
} failureBlock:^(NSError *error) { }];

PhotoKit 删除照片(用于iOS8, iOS9)

1.在相册中添加一张照片

    //首先获取相册的集合
PHFetchResult *collectonResuts = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:[PHFetchOptions new]] ;
//对获取到集合进行遍历
[collectonResuts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
PHAssetCollection *assetCollection = obj;
//Camera Roll是我们写入照片的相册
if ([assetCollection.localizedTitle isEqualToString:@"Camera Roll"]) {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//请求创建一个Asset
PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[UIImage imageNamed:@"pet"]];
//请求编辑相册
PHAssetCollectionChangeRequest *collectonRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
//为Asset创建一个占位符,放到相册编辑请求中
PHObjectPlaceholder *placeHolder = [assetRequest placeholderForCreatedAsset ];
//相册中添加照片
[collectonRequest addAssets:@[placeHolder]];
} completionHandler:^(BOOL success, NSError *error) {
NSLog(@"Error:%@", error);
}];
}
}];

2.在相册中删除照片

    PHFetchResult *collectonResuts = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:[PHFetchOptions new]] ;
[collectonResuts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
PHAssetCollection *assetCollection = obj;
if ([assetCollection.localizedTitle isEqualToString:@"Camera Roll"]) {
PHFetchResult *assetResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:[PHFetchOptions new]];
[assetResult enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//获取相册的最后一张照片
if (idx == [assetResult count] - 1) {
[PHAssetChangeRequest deleteAssets:@[obj]];
}
} completionHandler:^(BOOL success, NSError *error) {
NSLog(@"Error: %@", error);
}];
}];
}
}];

iOS 删除相册中照片--来自简书的更多相关文章

  1. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  2. 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片

    本书是分享微信jssdk开发的第二篇.     4.2.1 项目需求 需求说明:实现微信端的手机用户,点击按钮选取1张图片,分享到朋友圈. 4.2.2 需求分解 通过对需求的了解,可以将其分解为: ( ...

  3. iOS 删除NSString中特定字符

    +(NSString *) stringDeleteString:(NSString *)str { NSMutableString *str1 = [NSMutableString stringWi ...

  4. iOS 从相册中拿到 图片名 ,截取后缀,图片名

    //从路径中获得完整的文件名 (带后缀) 对从相册中取出的图片,视频都有效. NSString *fileName = [filePath lastPathComponent]; //获得文件名 (不 ...

  5. iOS开发-Runtime详解(简书)

    简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...

  6. iOS开发-Runloop详解(简书)

    不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件 ...

  7. iOS遍历相册中的图片

    //获取相册的所有图片 - (void)reloadImagesFromLibrary { self.images = [[NSMutableArray alloc] init]; dispatch_ ...

  8. iOS 获取相册中图片的名字 url

    __block NSString *imageFileName; NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenc ...

  9. Linux下安装MySQL----来自简书(挺好的)

    来自简书的: https://www.jianshu.com/p/f4a98a905011 注: 1. 下载方式: 可以使用命令下载: wget http://downloads.mysql.com/ ...

随机推荐

  1. Android应用开发学习之启动另外一个Activity

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一个Activity可以启动另外一个Activity,以实现比较复杂的功能,我们来看一个例子,其运行效果如下图所示: ...

  2. Unable to resolve target 'android-14' 解决办法

    学习安卓的时候用Eclipse导入工程之后出现Unable to resolve target 'android-14' 这样的问题,代码确定没有问题,因为是从网上教程下载的示例代码,上网搜索了一下, ...

  3. py练习

    功能类似pop def myPop():    l=[]    a=raw_input('a:')    for i in a:        l.append(i)    l.pop()    pr ...

  4. uva11624 - Fire!

    uva11624 - Fire! 火在蔓延,人在走.火会蔓延,不会熄灭,我们可以确定某个点着火的时间(广搜).对于J来说,要是他走到某点的时间比火蔓延到该点的时间要短,那么他走到该点的时候,火还没蔓延 ...

  5. 第04章-VTK基础(4)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  6. Docker搭建私有仓库

    1,下载仓库镜像. docker pull  registry    //主要用于搭建私有仓库的. 2,将宿主机端口映射到容器中去,容器的5000端口是不能更改的. docker run -d -p ...

  7. django表单及母板

    在之前的埔文中说到了对Model的操作以及对url的路由映射等内容,对应django的mtv框架则是完成了学习,Model与viewer的操作,那么本节主要来唠叨一下template,当Model,v ...

  8. 【转载】ADO.NET与ORM的比较(4):EntityFramework实现CRUD

    [转载]ADO.NET与ORM的比较(4):EntityFramework实现CRUD 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hiber ...

  9. windows2008无线网卡和.net3.5安装

    今天在联想T420S笔记本上安装windows2008标准版,安装完成后部分驱动软件不能安装,要求.net framework3.5,下载.net3.5安装时提示应该用角色管理器安装. 根据提示打开服 ...

  10. iOS开发~视图(UIView)与控件(UIControl)

    1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...