【问题标题】:Delete a photo from the user's photo library?从用户的照片库中删除照片?
【发布时间】:2011-01-11 11:49:56
【问题描述】:

有没有办法可以删除从UIImagePickerController 加载到我的应用程序中的图像?

我希望能够在用户执行特定操作时从用户的照片库中删除图像。

我提示用户从他们的库中选择一个图像,然后它被加载到我的应用程序中,此时应用程序会做一些时髦的动画,然后实际删除该图像。

请帮忙!

【问题讨论】:

    标签: iphone objective-c uiimagepickercontroller photolibrary


    【解决方案1】:

    Apple 实际上不允许您通过 API 从照片库中删除。用户必须实际转到照片应用程序并自己手动删除它。 Apple 确实允许您写入照片库:

    将静止图像保存到用户的 已保存的相册,请使用 UIImageWriteToSavedPhotosAlbum 功能。将电影保存到 用户的已保存照片相册,请使用 UISaveVideoAtPathToSavedPhotosAlbum 功能。

    但是对于删除和编辑/覆盖现有照片,Apple 目前没有类似的东西。

    【讨论】:

    【解决方案2】:

    实际上,您可以删除应用保存的照片(通过 UIImageWriteToSavedPhotosAlbum API 调用保存到照片库)。

    记录在案的 API [ALAsset setImageData:metadata:completionBlock:] 有效。

    1)。将图像“photo.jpg”添加到您的项目中

    2)。将图像保存到资源库:

    ALAssetsLibrary *lib = [ALAssetsLibrary new];
    UIImage *image = [UIImage imageNamed:@"photo.jpg"];
    [lib writeImageToSavedPhotosAlbum:image.CGImage metadata:@{} completionBlock:^(NSURL *assetURL, NSError *error) {
        NSLog(@"Write image %@ to asset library. (Error %@)", assetURL, error);
    }];
    

    3)。转到默认图库,您会在“已保存的照片”相册中找到 photo.jpg。

    4)。从资源库中删除此图像:

    ALAssetsLibrary *lib = [ALAssetsLibrary new];
    [lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
            if(asset.isEditable) {
                [asset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
                    NSLog(@"Asset url %@ should be deleted. (Error %@)", assetURL, error);
                }];
            }
        }];
    } failureBlock:^(NSError *error) {
    
    }];
    

    5)。转到默认图库,您会发现 photo.jpg 已被删除。

    【讨论】:

    • 它有效:)。但是, setImageData:metaData:completionBlock 函数用于替换图像,而不是根据 Apple 文档将其删除。你确定AppStore不会有问题吗?
    • 我已经有一个应用在苹果商店,这是一个公共API,在应用审核过程中没有问题。
    【解决方案3】:

    是的,我们可以删除照片。我们可以使用PHAssetChangeRequest 进行此操作。

    来自苹果:

    创建、删除、更改元数据或编辑照片资产内容的请求,以在照片库更改块中使用。

    class func deleteAssets(_ assets: NSFastEnumeration)
    

    资产在哪里: 要删除的 PHAsset 对象数组。

    PHAssetChangeRequest.deleteAssets([assetToDelete])
    

    所以,你可以使用上面的代码来删除资产。

    下面是swift 3代码,

    PHPhotoLibrary.shared().performChanges({
                let imageAssetToDelete = PHAsset.fetchAssets(withALAssetURLs: imageUrls as! [URL], options: nil)
                PHAssetChangeRequest.deleteAssets(imageAssetToDelete)
            }, completionHandler: {success, error in
                print(success ? "Success" : error )
            })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多