Получить только ландшафтные PHAssets с помощью PHFetchOptions

Я могу успешно получить видео, используя следующую функцию:

func getVideoAssets() {
    let options = PHFetchOptions()
    options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: false) ]
    options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue)

    videos = PHAsset.fetchAssets(with: options)
    print(videos)
    prepareCollectionView()
}

Однако я хотел бы получать только видео LANDSCAPE, так как мое приложение поддерживает только видео ландшафта. Я пробовал следующее:

options.predicate = NSPredicate(format: "(mediaType = %d) AND (pixelWidth > pixelHeight)", PHAssetMediaType.video.rawValue)

Но я получаю следующий сбой:

«NSInvalidArgumentException», причина: «Неподдерживаемый предикат в параметрах выборки: pixelWidth > pixelHeight»

Похоже, я не могу фильтровать с помощью этого метода. Есть ли другой способ сделать это? Кажется, что NSPredicate принимает только аргументы и не сравнивает два значения в PHAsset.

Как я могу получать только пейзажные видео с помощью PHFetchOptions?


person Julio    schedule 07.07.2018    source источник
comment
Вы всегда можете отфильтровать videos в новый массив на основе проверки ориентации.   -  person rmaddy    schedule 08.07.2018
comment
@rmaddy да, это то, что я все равно сделал   -  person Julio    schedule 09.07.2018


Ответы (1)


В итоге я выбрал решение, которое не использует NSPredicate, а просто фильтрует массив активов после его извлечения. У меня это сработало нормально, я надеялся использовать NSPredicate, но я доволен.

Надеюсь, это поможет кому-то еще:

// get landscape only content
let unfilteredVideosArray = PHAsset.fetchAssets(with: options)
var filteredVideosArray : [PHAsset] = []
for i in 0..<unfilteredVideosArray.count {
    let video = unfilteredVideosArray.object(at: i)
    if video.pixelWidth > video.pixelHeight {
        filteredVideosArray.append(video)
    }
}

self.videos = filteredVideosArray
person Julio    schedule 09.07.2018