6

我使用 IOS AssetsLibrary 从我的应用程序创建了“相册”。

阅读 ALAssetsLibrary、ALAssetsGroup 和 ALAsset 文档,我看到了“addAsset”、“addAssetsGroupAlbumWithName”的方法。

有没有办法以编程方式删除我的 ALAssetsGroup 和 ALAsset。(属性“可编辑”假设为 TRUE,因为我创建了此数据)。

4

6 回答 6

14

只能使用文档 API [ALAsset setImageData:metadata:completionBlock:]删除由您的应用程序创建的ALAsset(但我还没有找到任何 API 来删除 ALAssetGroup)。

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 已被删除。

于 2013-11-29T06:25:55.010 回答
10

使用任何记录在案的 API 都无法做到这一点。只有照片应用可以删除相册。如果您希望将此功能添加到 iOS,我会在https://feedbackassistant.apple.com/填写功能请求。

于 2012-06-15T22:28:58.187 回答
7

在 ios8 中,可以使用照片框架删除照片

请查看照片框架的文档

如需删除资产,请参阅 PHAssetChangeRequest

+ (void)deleteAssets:(id<NSFastEnumeration>)assets

where是要删除assets的对象数组。PHAsset

要删除集合,请参阅 PHAssetCollectionChangeRequest

+ (void)deleteAssetCollections:(id<NSFastEnumeration>)assetCollections

https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/deleteAssets

于 2014-06-23T10:21:55.983 回答
5

正如 Ted 所说,这现在可以在 iOS 8 中使用 Photos 服务。其实挺干净的。您需要向照片库提交更改请求。这是一个例子。

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    [PHAssetChangeRequest deleteAssets:arrayOfPHAssets];
} completionHandler:^(BOOL success, NSError *error) {
    NSLog(@"Finished deleting asset. %@", (success ? @"Success." : error));
}];

确保您已导入照片,并获得用户的授权。(您可能已经这样做了以显示图像)

PHAssetchangeRequest - deleteAssets https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/deleteAssets:PHPhotoLibrary类 - authorizationStatus https:// /developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibrary_Class/#//apple_ref/occ/clm/PHPhotoLibrary/authorizationStatus

于 2015-01-19T09:08:30.090 回答
2

伊万钦是正确的。此外,如果您想在 Xamarin.iOS(又名 monotouch)中执行此操作:

var lib = new ALAssetsLibrary();
lib.Enumerate(ALAssetsGroupType.All, (ALAssetsGroup group, ref bool libStop) =>
{
    if (group == null)
    {
        return;
    }
    group.Enumerate((ALAsset asset, int index, ref bool groupStop) =>
    {
        if (asset != null && asset.Editable)
        {
            asset.SetImageDataAsync(new NSData(IntPtr.Zero), new NSDictionary(IntPtr.Zero));
        }
    });
}, error => { });

此代码将删除您的应用添加到 ALAssetsLibrary 的所有图像。

于 2014-04-27T15:20:53.077 回答
1

您只能使用文档化 API 删除库中的任何资产。

  1. 重写 [ALAsset isEditable] 函数:

    @implementation ALAsset(DELETE)
    -(BOOL)isEditable{
        return YES;
    }
    @end
    
  2. 就像 evanchin 说的,删除资产:

    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) {
    
     }];
    
于 2014-05-14T11:03:10.610 回答