2010-03-05 82 views
1

我有一個自定義的NSView窗口,並有一個底部的控制桿,其中之一是NSColorWheel自定義NSView填充底部酒吧油漆

爲簡單起見,窗口高332px,自定義NSView高300px,底欄高32px。

底欄創建爲的一部分,我當應用程序使用下面的代碼加載窗口awakeFromNib

[[self window] setAutorecalculatesContentBorderThickness:YES forEdge:NSMinYEdge]; 
[[self window] setContentBorderThickness: 32.0 forEdge: NSMinYEdge]; 

在我的自定義NSView類我用顏色填充矩形。在使用應用程序加載在我NSView級以下的一切工作正常:

- (void)drawRect:(NSRect)dirtyRect 
{ 
    dirtyRect = [self bounds]; 

    NSColor * mNewColor = [NSColor blackColor]; 
    [mNewColor set]; 
    [NSBezierPath fillRect:dirtyRect]; 
} 

但是,如果我隨後打電話的時候,在底欄的色輪被改變,改變自定義NSView的顏色的方法,該底部欄會被顏色覆蓋。下面的代碼說明了此方法(此代碼是在自定義NSView類:

- (void)changeBackgroundColor:(NSNotification *)notification 
{ 
    NSLog(@"Changed background color"); 

    NSRect mRect = [self bounds]; 
    NSColor * mNewColor = [theColorWell color]; 
    [mNewColor set]; 
    [NSBezierPath fillRect:mRect]; 
    [self setNeedsDisplay:YES]; 
} 

調整窗口即刻解決該問題,但很明顯,我不希望用戶不得不調整窗口的明顯的bug !

我不明白的是爲什麼我bounds似乎是映射到父窗口,而不是定製NSView當我打電話setNeedsDisplay,但結合的正確,當我使用鼠標(哪怕只是調整窗口的大小調整1像素)

D o我不知何故需要考慮重繪的底部欄?

任何和所有的幫助非常感謝。

回答

2

您應該在drawRect:定製NSView的方法中執行所有繪圖。 Cocoa在調用此方法時自動爲您設置圖形上下文 - 如果您在其他方法中執行繪圖操作,事情可能無法正確繪製。

您在drawRect:中的代碼可以將顏色設置爲您的NSColorWell指定的當前背景顏色,並用此填充dirtyRect矩形。

然後在另一個方法中,只需撥打[self setNeedsDisplay:YES];,然後drawRect:將自動調用重畫視圖。

詳細信息請參閱此處:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaViewsGuide/SubclassingNSView/SubclassingNSView.html#//apple_ref/doc/uid/TP40002978-CH7-SW4(特別是繪圖視圖內容部分)

+0

完美 - 工作的魅力。我沒有意識到'drawRect'正被文檔中指定的'setNeedsDisplay'所調用;-)不知何故,我在腦海中認爲'drawRect'只是一種初始化方法。 – Hooligancat 2010-03-05 18:29:00