Фильтрация библиотеки фотографий по размеру изображения с помощью платформы Photos

Я создаю приложение iOS для выбора снимков экрана из библиотеки фотографий пользователя. Приложение работает, за исключением того, что я могу отображать все фотографии, и мне нужны только скриншоты. Чтобы обнаружить скриншоты, я хочу сопоставить размер изображения с размером экрана.

var userScreenshots: PHFetchResult!

let screenWidth = view.bounds.size.width * 2
let screenHeight = view.bounds.size.height * 2

let options = PHFetchOptions()
// Following line needs to be changed —>
options.predicate = NSPredicate(format: "(pixelWidth & %d) != 0 || (pixelHeight & %d) != 0", screenWidth, screenHeight)

options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

userScreenshots = PHAsset.fetchAssetsWithOptions(options)

Сбой:

2015-06-22 23:00:24.540 Altershot[95046:24515142] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate in fetch options: pixelWidth & 0 != 0'

Пожалуйста, объясните, как правильно определить этот предикат.


person Boris Y.    schedule 22.06.2015    source источник
comment
Что вы пытаетесь выбрать в своем предикате?   -  person Icaro    schedule 23.06.2015
comment
Фотографии только определенной ширины и высоты.   -  person Boris Y.    schedule 23.06.2015
comment
(pixelWidth == %d AND pixelHeight == %d)? И я бы посоветовал вместо * 2 использовать масштабный коэффициент (iPhone 6 Plus не должен проходить, я думаю, iPad mini тоже)   -  person Larme    schedule 23.06.2015
comment
Код @Larme больше не падает, но результат пуст. Воспользуюсь советом по весу, спасибо.   -  person Boris Y.    schedule 23.06.2015
comment
"(pixelWidth == %d AND pixelHeight == %d) OR (pixelWidth == %d AND pixelHeight == %d)" screenWidth, screenHeight , screenHeight, screenWidth? Возможно проблема с ориентацией.   -  person Larme    schedule 23.06.2015
comment
Нет, я нашел решение, спасибо, сэр. Я опубликую свой ответ здесь.   -  person Boris Y.    schedule 23.06.2015


Ответы (1)


Вот правильный код. Обратите внимание, что вместо магического числа 2 есть универсальное свойство scale, потому что у iPhone 6 Plus шкала 3. Я также включил пейзажные скриншоты, спасибо за комментарии. Кроме того, формула размера экрана была улучшена, чтобы подготовить его к многозадачности iOS 9.

var userScreenshots: PHFetchResult!

let scale = UIScreen.mainScreen().scale
let screenWidth = UIScreen.mainScreen().bounds.width * scale
let screenHeight = UIScreen.mainScreen().bounds.height  * scale

let options = PHFetchOptions()
options.predicate = NSPredicate(format: "(pixelHeight == %d AND pixelWidth == %d) OR (pixelHeight == %d AND pixelWidth == %d)", argumentArray: [screenHeight, screenWidth, screenWidth, screenHeight])

options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

userScreenshots = PHAsset.fetchAssetsWithOptions(options)
person Boris Y.    schedule 23.06.2015