11

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 日かかり、何らかの理由でこれらの写真がPHFetchResults に含まれていることが原因であると思われます。

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オブジェクトが削除された写真を表しているかどうかを確認する方法はありますか? 「最近削除した」アルバムに含まれる写真を除外するために、取得しているアセットを絞り込む方法はありますか?

4

3 に答える 3

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 で削除された写真アセットについては、次の 2 つは NO を返します。

[asset canPerformEditOperation:PHAssetEditOperationContent] 
[asset canPerformEditOperation:PHAssetEditOperationProperties]

PHAssetランタイム ヘッダーには、次の便利なプロパティがあります。

@property (getter=isTrashed, nonatomic, readonly) bool trashed;
@property (nonatomic, readonly) NSDate *trashedDate;
于 2014-10-03T09:47:33.273 に答える
0
PHFetchResult * recentlyDeletedAlbum = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:1000000201 options:nil];

これは、最近削除されたすべてのアセットのコレクションを返します。このコレクション内のすべてのオブジェクトの PHAsset を繰り返し取得して、PHAsset が削除されたかどうかを確認できます。

于 2016-07-16T20:24:50.787 に答える