Хобрук: Ваш путь к мастерству в программировании

Свойство NSCollectionView visibleRect

NSCollectionView отображает несколько элементов. У меня есть макет, похожий на сетку.

Мне нужно определить элементы, которые в настоящее время видны.

Согласно документации существует метод

- (NSArray<NSCollectionViewItem *> *)visibleItems;

с описанием

Элементы, возвращаемые этим методом, представляют собой те, которые активны и в настоящее время управляются представлением коллекции. Этот массив может содержать элементы, которые находятся за пределами фактического видимого прямоугольника представления коллекции. Например, он может содержать элементы, которые недавно были видны, но с тех пор исчезли из поля зрения. Чтобы проверить, виден ли элемент на самом деле, проверьте, пересекает ли его прямоугольник рамки visibleRect представления коллекции.

Поэтому мне нужно вручную вычислить, какие элементы видны на основе его frame координат и visibleRect коллекцииView. Это нормально, конечно.

Однако меня беспокоит, какие координаты возвращает visibleRect.

Обычно это согласуется с здесь если у меня есть, скажем

NSImage *img = [[NSImage alloc] initWithContentsOfFile:...];

[imageView setFrame:NSMakeRect(0., -100., 300., 400.)];
[imageView setImage:img];
NSLog(..., [imageView visibleRect]);
NSLog(..., [imageView frame]);

тогда видимый прямоугольник будет иметь, как и ожидалось,

x=0
y=100
width = 300
height = 300

И это полностью согласуется с документацией.

Однако в случае с NSCollectionView он ведет себя иначе. Если я создал элементы и отображается первый элемент, то будет отображаться visibleRect

x = 0
y = 0

Теперь, если я прокрутлю немного вниз, вывод будет

x = 0
y = some number > 0

Однако я ожидаю, что он должен вернуть другое значение y. Потому что

Видимый прямоугольник представления отражает часть содержимого, которое фактически отображается, с точки зрения системы координат границ представления.

Предполагая, что между элементами нет интервала, а элементы идентичны

x = 0
y = (numItems - 1) * itemHeight

введите здесь описание изображения

Такое поведение, конечно, не проблема. Я могу использовать эти значения для вычислений на основе возвращаемых значений. Я хочу понять причину.

Что мне не хватает?

P.S. По сути, NSCollectionView visibleRect вместе с frame его элементами ведет себя так, как если бы начало системы координат находилось в верхнем левом углу с y, увеличивающимся вниз, и x, увеличивающимся вправо.


  • Я не уверен, что вы пытаетесь сделать. Вы говорите: «Мне нужно определить элементы, которые в данный момент видны», но (как вы указываете) NSCollectionView уже делает это за вас. Кто я в этом случае? Ваш собственный подкласс NSCollectionView или NSCollectionViewLayout? 19.03.2019
  • Представление коллекции @mr.fixit не делает этого автоматически. Он может вернуть только массив элементов, которые использовались в последнее время. Однако, если пользователь прокручивает элемент, он все еще может использоваться, но на самом деле не виден. Чтобы определить действительно видимые элементы, вам необходимо проверить, пересекает ли прямоугольник рамки элемента видимый прямоугольник представления коллекции. Когда вы начинаете это делать, вам нужно иметь дело с координатами. Так как в документации не написано, что NSCollectionView использует перевернутые координаты, я запутался. 21.03.2019

Ответы:


1

NSCollectionView использует перевернутую систему координат. См. свойство flipped для NSView и Перевернутые системы координат.

16.03.2019
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..