2012-01-09 161 views
3

我想实现一个NSOutlineView子与渐变背景:NSOutlineView渐变背景

- (void)drawBackgroundInClipRect:(NSRect)clipRect { 
    [gradient drawInRect:clipRect angle:90]; 
} 

它几乎可以作为假定:

但是当我调整看法,梯度“打破”:

除了在物品所覆盖的区域以外,渐变在各处都能正确渲染。当我改变窗口的关键状态(通过切换到另一个应用程序),该区域也被正确渲染,就像我折叠队列项目一样。我错过了什么?调整大小后,我应该怎样更新该区域的背景?

+1

我可以看到颜色方案变得难以阅读,特别是当你达到15+队列时。 – 2012-01-09 23:52:25

+0

是的,我知道,但在这一点上,我只是想弄清楚如何制作渐变。 – 2012-01-10 08:35:52

回答

1

我不得不迁移到查看基于-NSOutlineView,下面的代码工作完全与它:

- (void)drawBackgroundInClipRect:(NSRect)clipRect { 
    [gradient drawInRect:self.frame angle:90]; 
} 
+0

'self.frame'?不应该是'self.bounds'? – zneak 2014-05-06 16:39:54

2

剪辑矩形是已更改的区域,不一定是渐变的整个区域。如果您想让渐变从视图的可见区域的顶部开始,并在视图的可见区域的底部结束,那么您需要每次都使用相同的矩形绘制渐变。

使用the NSRectClip function夹到指定的矩形,你应该,然后问自己(大纲视图)为your enclosing scroll view,请滚动视图the visible rect,并告诉滚动视图convert that rect to the outline view's coordinate system这将限制绘图。

+0

这就是我最后的结果:'NSRect visibleRect = self.enclosingScrollView.visibleRect; NSRect rect = [self.enclosingScrollView convertRect:visibleRect toView:self]; [gradient drawInRect:直角:90];' 不幸的是,它的行为完全一样。我尝试添加rect的原点和大小的日志记录,当我更改窗口的关键状态时,它记录的是完全相同的rect,就像我调整它的大小时一样,但调整“休息”渐变并切换到另一个窗口“修复”它。我不明白发生了什么事。 – 2012-01-10 09:15:27

0

我认为大纲视图不重绘现有项目时,大小的变化,因为通常它不”不需要。在您的视图中,为NSViewFrameDidChangeNotification添加通知侦听器,并在帧更改时在视图上调用-setNeedsDisplay

+0

试过这个,不起作用。我在-setFrameSize中调用了SetNeedsDisplay,而不是侦听NSViewFrameDidChangeNotification,但我认为这没什么区别。 – 2012-01-11 15:48:22

+0

您是否检查过-setFrameSize实际上是否被调用? – 2012-01-11 16:16:54

+0

是的,我做到了。它正如预期的那样被调用。 – 2012-01-11 18:58:06