使用 PHFetchOptions 获取 Landscape Only PHAssets
Fetch Landscape Only PHAssets using 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()
}
但是,我只想获取横向视频,因为我的应用仅支持横向视频。
我尝试了以下方法:
options.predicate = NSPredicate(format: "(mediaType = %d) AND (pixelWidth > pixelHeight)", PHAssetMediaType.video.rawValue)
但是我遇到了以下崩溃:
'NSInvalidArgumentException', reason: 'Unsupported predicate in fetch options: pixelWidth > pixelHeight'
看来我无法使用该方法进行过滤。还有另一种方法可以做到这一点吗?似乎 NSPredicate 只接受参数而不比较 PHAsset 中的 2 个值。
我怎样才能使用 PHFetchOptions 只检索横向视频?
我最终选择了一个不使用 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
我可以使用以下功能成功检索视频:
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()
}
但是,我只想获取横向视频,因为我的应用仅支持横向视频。 我尝试了以下方法:
options.predicate = NSPredicate(format: "(mediaType = %d) AND (pixelWidth > pixelHeight)", PHAssetMediaType.video.rawValue)
但是我遇到了以下崩溃:
'NSInvalidArgumentException', reason: 'Unsupported predicate in fetch options: pixelWidth > pixelHeight'
看来我无法使用该方法进行过滤。还有另一种方法可以做到这一点吗?似乎 NSPredicate 只接受参数而不比较 PHAsset 中的 2 个值。
我怎样才能使用 PHFetchOptions 只检索横向视频?
我最终选择了一个不使用 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