我正在尝试使用iOS 8中的新照片框架抓取设备上拍摄的最后一张照片的缩略图。我现在要执行此操作的代码如下:
PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
PHFetchResult *assetsInfo = [PHAsset fetchAssetsWithOptions:fetchOptions];
PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.version = PHImageRequestOptionsVersionCurrent;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
[[PHImageManager defaultManager] requestImageForAsset:[assetsInfo objectAtIndex:1]
targetSize:CGSizeMake(100, 100)
contentMode:PHImageContentModeAspectFill
options:requestOptions
resultHandler:^(UIImage *result, NSDictionary *info) {
if (result) {
// galleryButton is just a UIButton in the view
[galleryButton setImage:result forState:UIControlStateNormal];
}
}];
代码设法抓取设备上最近拍摄的照片,但如果删除了设备上拍摄的最后一张照片,则不考虑该事实,并且按钮的图像设置为已删除的照片。 resultHandler
。这似乎是因为在iOS 8中,当您删除照片时需要30天才能将其从设备中删除,并且出于某种原因这些照片仍然包含在PHFetchResult
中。
我试图在PHAsset
中包含的assetsInfo
个对象中查找“已删除”或类似属性,但我找不到任何类型的信息。调试器中已删除照片的打印输出如下所示:
<PHAsset: 0x57462a0> 7689FC1C-9EE2-4FF7-9B37-4A032A3FDA01/L0/001 mediaType=1/0, assetSource=2, (1536x2048), creationDate=2014-09-22 06:45:10 +0000, location=1, hidden=0, favorite=0
assetsInfo
中下一个对象的打印输出,我验证的照片未已删除,如下所示:
<PHAsset: 0x57461a0> E48D1482-395B-405C-85F9-FFD04D9EBFBD/L0/001 mediaType=1/0, assetSource=3, (2448x3264), creationDate=2014-09-21 04:24:55 +0000, location=0, hidden=0, favorite=0
似乎没有任何信息可以告诉我照片是否被删除。我想也许hidden
属性会有所帮助,但这与照片是否显示在特定的Photos.app相册/集合中有关。我认为可能assetSource
属性可能有用,但似乎没有记录,经过进一步调查似乎也与删除的照片状态无关。
有没有办法查看PHAsset
对象是否代表已删除的照片?有没有办法缩小我要提取的资产以排除“最近删除的”专辑中包含的照片?
答案 0 :(得分:8)
PHFetchResult *fetchResults = [PHAsset fetchAssetsWithOptions:options];
NSArray* tempArray = [fetchResults objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, fetchResults.count)]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description contains %@",@"assetSource=3"];
NSArray *filteredArray = [tempArray filteredArrayUsingPredicate:predicate];
filteredArray不包含“最近删除的”相册,并且没有相同的照片。此外,对于assetsInfo中已删除的照片资产,以下两个将返回NO。
[asset canPerformEditOperation:PHAssetEditOperationContent]
[asset canPerformEditOperation:PHAssetEditOperationProperties]
在PHAsset Runtime Headers中有一些有用的属性:
@property (getter=isTrashed, nonatomic, readonly) bool trashed;
@property (nonatomic, readonly) NSDate *trashedDate;
答案 1 :(得分:0)
PHFetchResult * recentlyDeletedAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:1000000201 options:nil];
这将返回所有最近删除的资产的集合。您可以迭代并获取此集合中所有对象的PHAsset,以检查您的PHAsset是否已删除。
答案 2 :(得分:0)
没有属性指示该相集是否被删除
它对我有用的唯一方法是使用PHAssetLocalID再次检查
if PHAsset.fetchAssets(withLocalIdentifiers: [pHAsset.localIdentifier], options: .none).count == 0 { }