zoukankan      html  css  js  c++  java
  • iOS 删除相册中照片--来自简书

    来自: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);
                   }];
                }];
            }
        }];
  • 相关阅读:
    Shiro加密
    SpringBoot操作MongoDB实现增删改查
    ArrayList 源码分析(JDK1.8)
    Java 内存泄漏
    Java 原型模式(克隆模式)
    3.2-3.3 Hive中常见的数据压缩
    7、html的body内标签之图片及表格
    6、html的body内标签之超链接
    5、html的body内标签之多行文本及下拉框
    3.1 HiveServer2.Beeline JDBC使用
  • 原文地址:https://www.cnblogs.com/lushengcao/p/4978998.html
Copyright © 2011-2022 走看看