NSCollectionView显示多个项目。我有一个类似Grid的布局。
我需要确定当前可见的项目。
根据documentation,有一种方法
- (NSArray<NSCollectionViewItem *> *)visibleItems;
与描述
此方法返回的项表示活动且当前由集合视图管理的项。此数组可能包含集合视图的实际可见矩形之外的项目。例如,它可能包含最近可见但之后已滚动到视图外的项目。要测试项目是否实际可见,请检查其框架矩形是否与集合视图的
visibleRect
相交。
所以我需要根据它的frame
坐标和collectionView的visibleRect
手动计算哪些项目是可见的。当然没关系。
然而,困扰我的是visibleRect
返回的坐标。
通常,如果我说的话,它与documentation here一致
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
当然,这种行为不是问题。我可以使用这些值根据返回的值计算内容。我想了解原因。
我错过了什么?
附:基本上NSCollectionView
visibleRect
和它的项目的frame
表现得好像坐标系的起源在左上角,y
增加下来,x
增加右。
NSCollectionView
使用翻转坐标系。查看flipped和NSView
的Flipped Coordinate Systems属性。