2012-01-09 162 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