PHAsset的PHFetchOptions与Photos.app的排序顺序相同

时间:2015-03-13 00:09:38

标签: ios objective-c swift photokit

我正在使用新的PHFetchOptions' sortDescriptors用于从相机胶卷获取PHAssets。似乎只有两个键可以排序:creationDate和modificationDate,它们都与你在Photos.app中看到的相同。

我错过了什么吗?我们怎样才能让它发挥作用?

4 个答案:

答案 0 :(得分:7)

我使用以下代码获取智能相册列表,其中包括“相机胶卷”:

// get the smart albums
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (NSInteger i = 0; i < smartAlbums.count; i++) {
    PHAssetCollection *assetCollection = smartAlbums[i];
    // Then use the following to get the photo images:
    PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    }

默认排序顺序是集合中现有的资产顺序,包括“相机胶卷”。为选项传递“nil”将获得默认值。您可以对相机胶卷中的图像重新排序,此代码将反映更改。

答案 1 :(得分:3)

有一个超级简单的解决方案。

  1. 创建一个没有任何特定选项的获取结果。

    // ...
    
    let options = PHFetchOptions()
    fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: options)
    
    if fetchResult.count > 0 {
      collectionView.reloadData()
    }
    
    // ...
    
  2. 当您尝试加载某个资产时,只需使用反向索引。

    // ...
    
    let reversedIndex = fetchResult.count - indexPath.item - 1
    let asset = fetchResult[reversedIndex] as! PHAsset
    
    // ...
    
  3. 这样您就可以获得与Photo.app完全相同的流程顺序。

    希望你觉得它有用。 :

答案 2 :(得分:0)

按照@Majotron的回答,我想以与“照片”应用中的(.*)相册完全相同的顺序获取所有用户的照片,并且仅包含图像资产。

这是我设置All Photos的方式:

PHFetchOptions

并使用TableView / CollectionView中的反向索引获取特定资产:

let allPhotosOption = PHFetchOptions()
// Fetch only image asset
allPhotosOption.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue)
// Get All Photos album collection
let userLibrary = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary, options: nil).firstObject
allPhotosResult = PHAsset.fetchAssets(in: userLibrary!, options: allPhotosOption)

如果您正在聆听照片库的更改,请特别小心,并相应地重新排列视图。如果更改与删除相关,请在更改之前使用获取结果获取反向索引,否则使用let asset = allPhotosResult.object(at: allPhotosResult.count - indexPath.item - 1)

这是我的处理方式:

.fetchResultAfterChanges

答案 3 :(得分:0)

我知道这是一个古老的问题,但我认为分享一个有效的答案会很有用。

这解决了在此问题PHFetchOptions for PHAsset in same sort order as Photos.app中购买并可以在iOS 13中使用的问题。

PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
PHFetchResult<PHAssetCollection *> *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
PHFetchResult<PHAsset *> *allPhotos = [PHAsset fetchAssetsInAssetCollection:smartAlbums.firstObject options:allPhotosOptions];

就是这样。请记住,顺序是最新的图像/视频,所以,如果您想首先显示最新的图像/视频(根据需要),请使用

[allPhotos objectAtIndex:(allPhotos.count - 1 - indexPath.item)];