在其边界之外绘制NSTableView的背景

Dov*_*Dov 10 cocoa nstableview nsscrollview osx-lion

我有一个问题,因为Lion引入了弹性滚动(如下图所示).当您滚动我的表视图(基于单元格,具有交替的行颜色)超出其范围时,背景不会绘制.我已经尝试过自己的绘图-[drawBackgroundInClipRect:],但似乎你不能超出表视图的范围.如何将背景扩展到弹性滚动区域?

滚动表左侧

Jos*_*zzi 0

回答你的问题

在其边界之外绘制视图通常是禁忌。当使用交替背景颜色时,NSTableView 直接绘制其背景。但在基于视图的表格视图中,使用 NSTableRowView ,如果它有自己的背景颜色,这就带来了更大的挑战。

坏消息

NSScrollView(及其各个部分)、NSTableView 和 NSTableHeaderView 的组合本身就很复杂。一旦您将基于视图的功能放入混合中(其中每行都有一个视图,每个单元格都有自己的视图,并且每个单元格都被重用,围绕动画等),覆盖这种行为“是不可能度过一生的,儿子!” ;-)

好消息

交替背景颜色未在弹性拉伸的滚动表视图中扩展的问题得到解决(至少在 10.10 上,我可以这么说),因此这不再是问题,除非您有具有自定义背景的行/单元格视图或只是背景颜色。

自定义文档(滚动)视图的通用解决方案

对于您希望扩展弹性滚动的所有其他具有规则背景的滚动视图,您需要一个自定义 NSScrollView 子类,该子类期望文档视图(您的自定义滚动视图)符合您定义的协议(例如-(NSImage *)backgroundImageForClipViewBounds:)。滚动视图将观察其内容视图(NSClipView)以获取边界更改通知并标记自身以进行显示。当滚动视图-drawRect:被调用时,它会询问滚动视图-backgroundImageForClipViewBounds:(通过您的协议)并将其绘制到自身中,从而使滚动视图的“无限背景”成为自己的。

我还没有测试过这个理论,但我相信它会起作用。我希望这有帮助。