自从 Lion 引入弹性滚动(如下图所示)以来,我遇到了一个问题。当你在我的表视图(基于单元格,并带有交替行颜色)中滚动超出其边界时,背景不会绘制。我尝试在
-[drawBackgroundInClipRect:]
中进行自己的绘制,但好像不能超出表视图的边界。我该如何将背景延伸到弹性滚动区域?
-[drawBackgroundInClipRect:]
中进行自己的绘制,但好像不能超出表视图的边界。我该如何将背景延伸到弹性滚动区域?
回答您的问题
视图超出其边界通常是不可取的。在使用交替背景色时,NSTableView 直接绘制其背景。但在基于视图的表格视图中,使用 NSTableRowView,如果它有自己的背景颜色,则会带来更多的挑战。
坏消息
NSScrollView(及其各个部分)、NSTableView 和 NSTableHeaderView 的集合本身就很复杂。一旦将基于视图的功能混合在一起(其中每行都有一个视图,每个单元格都有自己的视图,并且每个视图都可以被重用、动画化等),覆盖此行为“不是人生的正确方式!” ;-)
好消息
交替背景颜色未在弹性拉伸滚动表视图中扩展的问题已经得到解决(至少在我所知道的 10.10 上),因此除非您具有具有自定义背景或仅背景颜色的行/单元格视图,否则这不再是问题。
自定义文档(滚动)视图的通用解决方案
如果您希望为具有规则背景的所有其他滚动视图扩展弹性滚动,那么您需要一个自定义的NSScrollView子类,该子类期望文档视图(您的自定义滚动视图)符合您定义的协议(如 -(NSImage *)backgroundImageForClipViewBounds:
)。 滚动视图将观察其内容视图(NSClipView)以获取边界更改通知并标记自己进行显示。 当调用滚动视图的 -drawRect:
时,它将询问滚动视图其 -backgroundImageForClipViewBounds:
(通过您的协议),并将其绘制到自身中,从而使滚动视图的“无限背景”成为自己的背景。
我还没有测试过这个理论,但我相信它会起作用。希望这可以帮助到您。