NSCollectionView свойство visibleRect - PullRequest
1 голос
/ 14 марта 2019

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

enter image description here

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

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

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

1 Ответ

0 голосов
/ 16 марта 2019

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

...