ALAssetsLibrary删除ALAssetsGroup / ALAsset

时间:2012-06-15 16:37:51

标签: ios5 alassetslibrary assets alasset assetslibrary

我使用IOS AssetsLibrary从我的应用程序创建了“照片专辑”。

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

有没有办法删除 PROGRAMMATICALLY 我的ALAssetsGroup和ALAsset。 (属性'editable'假设为TRUE,因为我创建了这个数据)。

6 个答案:

答案 0 :(得分: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已被删除。

答案 1 :(得分:10)

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

答案 2 :(得分:7)

使用照片框架

可以在ios8中删除照片

请查看Photos Framework的文档

要删除资产,请参阅PHAssetChangeRequest

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

其中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

答案 3 :(得分:5)

正如Ted所说,现在可以在iOS 8中使用照片服务了。它实际上非常干净。您需要向photolibrary提交更改请求。这是一个例子。

[[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

答案 4 :(得分:2)

evanchin是正确的。此外,如果你想在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的所有图片。

答案 5 :(得分: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) {
    
     }];