NSCollectionView отображает несколько элементов. У меня есть Grid-подобный макет.
Мне нужно определить элементы, которые в данный момент видны.
Согласно документации существует метод
- (NSArray<NSCollectionViewItem *> *)visibleItems;
с описанием
Элементы, возвращаемые этим методом, представляют собой элементы, которые являются активными и в настоящее время управляются представлением коллекции. Этот массив может содержать элементы, которые находятся за пределами фактического видимого прямоугольника представления коллекции. Например, он может содержать элементы, которые были недавно видны, но с тех пор были прокручены вне поля зрения. Чтобы проверить, является ли элемент действительно видимым, проверьте, пересекает ли его прямоугольник рамки visibleRect
представления коллекции.
Поэтому мне нужно вручную рассчитать, какие элементы видимы, основываясь на его frame
координатах и visibleRect
из collectionView. Это нормально, конечно.
Однако меня беспокоит то, какие координаты 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
увеличивалось вправо.