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
, увеличивающимся вправо.