iOS相册中如何删除照片

作者: Lilin_Coder | 来源:发表于2015-11-08 22:20 被阅读10694次

最近公司的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相册中如何删除照片

    最近公司的app有一个新功能是在app中删除相册的照片 ,本来是一个比较简单地功能,在做的过程中却发现Assets...

  • Slidebox

    iOS系统相册不好整理皂片,需要配合其他app来补救,心累。 整理的需求包括:删除照片、照片分类归入不同相册、收藏...

  • 照片框架PhotoKit使用记录

    1、创建自定义相册并命名 2、保存图片至相册 3、从指定相册读取照片资源 4、删除指定相册的指定图片 5、将相册中...

  • 【iOS开发】Connection to assetsd was

    在iOS开发中,通过 UIImagePickerController 获取系统相册中的照片的 URL 并不非常的直...

  • iOS删除照片代码

    iOS删除照片代码

  • 菠萝相册

    软件介绍 菠萝相册是一个提供私密空间的相册管理工具。 【批量删除、移动照片】 【创建、删除相册】 【密码访问隐私相...

  • UIImagePickerController iOS11调起相

    UIImagePickerController iOS11调起相册 中的照片被导航栏遮挡 为了适配iOS11下来刷...

  • UIImagePickerController 照片被导航栏遮挡

    UIImagePickerController 在iOS11中调起相册时 照片被导航栏遮挡,添加transluce...

  • Photowipe

    功能虽少却很实用 Photowipe只专注于一件事:代替ios系统删除相册里的照片。 整个App除了简单还是简单,...

  • iOS Swift Photos框架 修改相册照片 创建时间 定

    本文介绍如何使用Photos框架修改相册中的照片信息 修改照片创建时间 最近项目在做相册,网上找了很久的资料发现关...

网友评论

  • 一路向北客:删除时候那个提示框拿不掉吗
  • 狗狗臭鸡蛋:[PHAssetChangeRequest deleteAssets:@[obj]];
    会弹出一个系统提示框,怎么设置弹窗的语言呢?比如一般是中文的,如何设置成英文呢?
    stoicer:这个弹框这么去掉呢
    c170dc2aa789:我也有这个疑问,同求:pensive:
  • 863c73f31933:楼主,我这边iOS10删除相册最后一张图片,照你上面的写法怎么不进方法呢
  • 634585edc862:你好,我现在选择多张图片删除,,体统会多次弹出一个提示框,,我怎么不让系统弹出那个提示框 或者是仅让它弹出一次呢
    char_hu:@FreeLeaves 因为没有找到解决方案,所以我换成了,存储到沙盒。这样,管理起来就更方便。
    FreeLeaves:@char_hu 解决了吗?分享一下下。。。
    char_hu:@子瓜虫 我也在关注你这个问题。希望找到解决方案了,相互讨论下,歇息
  • f3075a9056dc:您好,您的是删除最后一张照片,但我现在做的是一个导入选中照片,然后提示是否删除相册中的,我现在能获取这个导入的照片数组,请问这种情况要怎么删除相册中这些照片呢?
    推遍天下无敌手:@年轻的老司机 老司机,问题解决了吗?系统相册的图片怎么删除
  • 415c742fdf1a:恩恩,谢谢啦
  • 415c742fdf1a:亲,我要对相册中的某些图片加密,我想的是获取手机中的相簿的路径 ,找到文件加密,这样貌似不可行。。。如果通过这个框架得到图片再加密图片,是否就是加密了相册的图片?
    415c742fdf1a:谢谢哦
    Lilin_Coder:@果冻呀 不过现在的情况是拿到照片加密再保存,是会在相册再保存一张新的照片的,你可以看一下有没有接口能够直接修改原图片的?
    Lilin_Coder:@果冻呀 亲 ,我没研究过图片加密问题,爱莫能助。。
  • 遗忘的黑鹰:换一种说法,如何在适配IOS7~9的设备下,能够删除相册的照片?
    遗忘的黑鹰:@Lilin_Coder 嗯,我也是,没有IOS7的机器,现在只有通过IOS版本来做适配了,谢谢啦
    Lilin_Coder:@Smiacter_Yin iOS8以上使用Photokit的话能够删除相册测照片,AssetsLibary下好像是有这个情况,记得在知乎的某个回答上有人这么说过,因为我现在没有iOS7的机器,Xcode6.4下的iOS7模拟器也已经打不开了,所以现在无法验证这个问题,如果你有了验证结果的话请告诉我 :blush:
  • 遗忘的黑鹰:在IOS7中的删除方法,只能删除通过自己APP添加的asset,我想通过我自己的APP删除相册的asset咋个搞呢?isEditable默认为NO,readonly.
    ZhongXi:@Smiacter_Yin 我有设备,报了错误
    Error Domain=ALAssetsLibraryErrorDomain Code=-3300 "Write failed" UserInfo=0x14edf940 {NSLocalizedDescription=Write failed, NSUnderlyingError=0x14eb7580
    "The operation couldn’t be completed. (ALAssetsLibraryErrorDomain error -3300.)", NSLocalizedFailureReason=There was a problem writing this asset because the write failed.}
    遗忘的黑鹰:@iGeekXi 我和博主是一样的 目前手上没有ios7的设备 无法测试到是否能够删除 不过ios7和之后的系统版本是我写了两套代码的 通过系统版本调用不同的代码…… 删除的话仍没有测出来 没有设备……
    ZhongXi:@Smiacter_Yin 你好,请问iOS7删除图片的问题解决了嘛?谢谢~
  • ShawnDu:牛叉
    ShawnDu:@杜帅帅_shawn ୧(๑•̀⌄•́๑)૭

本文标题:iOS相册中如何删除照片

本文链接:https://www.haomeiwen.com/subject/rzochttx.html