在NSTableView中插入/删除行,同时保持特定行锚定在适当位置

时间:2013-05-07 11:02:56

标签: macos cocoa nstableview

我在NSTableView中显示2种类型的数据,我们称它们为A型和B型。它是单列,每行是A型或B型。我有3个按钮,基本上过滤数据显示A类型行/ B类型行/ A& B类型行。每行都是可变高度,具体取决于文本量。

当按下过滤器按钮时,我正在加载新的数据数组并将其与旧数组进行比较,从而构建一个NSIndexSet行,这些行将被移除或插入动画。到目前为止都很好。

挑战在于视觉上这对用户来说是迷惑的,因为删除或插入行意味着没有“锚行”保持可见。

e.g。显示A& B类型的数据,并且在表视图中当前可见行7-12。按过滤器按钮仅显示类型A数据,导致行2/4/5被删除但由于滚动位置保持不变,第一个可见行现在是第10行。

通过定义传出和传入数据数组中存在的第一个可见行的“锚行”,我可以计算需要应用的滚动偏移量,以使此锚行保持在屏幕上的相同位置。这在没有行动画的情况下完美地工作,但在使用动画时会成为一个巨大的问题。

由于没有直接的方法来动画NSTableView的滚动位置,我已经尝试动画NSClipView的scrollPoint(导致锚行抖动,因为动画没有完全同步)和动画的原点NSClipView边界(在动画期间不会正确地重绘,而根本没有绘制的行似乎是与NSTableView的核心动画冲突)。

所以我的问题是,是否有更简单的方法(NSTableView的子类?)或者我将不得不放弃NSTableView并使用NSView子视图创建自定义类?

0 个答案:

没有答案