NSCollectionView visibleRect属性

时间:2019-03-14 19:23:09

标签: objective-c macos cocoa core-graphics nscollectionview

NSCollectionView显示多个项目。我有一个类似于网格的布局。

我需要确定当前可见的项目。

根据documentation,有一种方法

- (NSArray<NSCollectionViewItem *> *)visibleItems;

带有说明

  

此方法返回的项目表示集合视图中处于活动状态且当前正在管理的项目。此数组可能包含集合视图实际可见矩形之外的项目。例如,它可能包含最近可见但从视图中滚动出来的项目。要测试某个项目是否实际可见,请检查其框架矩形是否与集合视图的visibleRect相交。

因此,我需要根据collectionView的frame坐标和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

enter image description here

这种行为当然不是问题。我可以使用这些值根据返回的值来计算事物。我想了解原因。

我想念什么?

P.S。本质上NSCollectionView visibleRect及其frame的行为就像坐标系的原点在左上角,y向下增加,x增加权利。

1 个答案:

答案 0 :(得分:0)

NSCollectionView使用翻转坐标系。 请参见NSViewflippedFlipped Coordinate Systems属性。