【问题标题】:PHFetchOptions() Photos Only Using PHAsset & PHAssetCollectionPHFetchOptions() 仅使用 PHAsset 和 PHAssetCollection 的照片
【发布时间】:2017-01-10 19:03:48
【问题描述】:

我在这里使用了 Apple 示例代码中的一部分:

override func awakeFromNib() {
    // Create a PHFetchResult object for each section in the table view.
    let allPhotosOptions = PHFetchOptions()
    allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    let allPhotos = PHAsset.fetchAssetsWithOptions(allPhotosOptions)
    let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .AlbumRegular, options: nil)

    let topLevelUserCollections = PHCollectionList.fetchTopLevelUserCollectionsWithOptions(nil)

    // Store the PHFetchResult objects and localized titles for each section.
    self.sectionFetchResults = [allPhotos, smartAlbums, topLevelUserCollections]
    self.sectionLocalizedTitles = ["", NSLocalizedString("Smart Albums", comment: ""), NSLocalizedString("Albums", comment: "")]

    PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
}

这会成功列出所有专辑。

我需要什么:

我想只列出带照片的相册,排除视频。此外,将视频排除在相册中,例如在“所有照片”中。

我尝试了什么:

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)

这会导致崩溃说“获取选项中不受支持的谓词:mediaType == 1”

【问题讨论】:

  • 这个问题提到资产集合没有mediaTypes(有道理,它们可以包含多种类型):stackoverflow.com/q/35590640你没有展示你如何应用谓词,但我猜您必须以其他方式过滤集合。
  • @RhythmicFistman 到目前为止,我相信 cellForItemAtIndexPath 是我必须检查和过滤的地方。
  • 是不是太晚了?你当时还没有告诉集合视图numberOfItemsInSection 中不需要的非图像吗?我认为你应该在那之前过滤。
  • 这是真的!所以这行不通..

标签: ios swift phasset phfetchoptions phassetcollection


【解决方案1】:

到目前为止,它对我来说很好:

let allAlbums = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)
let someAlbum = allAlbums.object(at: 0)
let onlyPhotoOption = PHFetchOptions()
onlyPhotoOption.predicate = NSPredicate(format: "mediaType == %i", PHAssetMediaType.image.rawValue)
let photos = PHAsset.fetchAssets(in: someAlbum, options: onlyPhotoOption)

【讨论】:

    【解决方案2】:

    我知道这是一个很晚的答案,但是如果像我这样的人来到这里,您应该使用此方法来检索媒体类型。在这种情况下 PHAssetMediaType.image

    func fetchAssets(with mediaType: PHAssetMediaType, options: PHFetchOptions?) -> PHFetchResult<PHAsset>
    

    所以在 Swift 5 中它写成

    let allPhotosOptions = PHFetchOptions()
    allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    fetchResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
    

    【讨论】:

    • 抱歉,这只会从所有相册中获取照片,而不是特定相册。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多