2010-12-13 47 views
1

各種各樣的東西,包括(可能最值得注意)的窗口失去其主要地位,然後被帶回到焦點,導致我的一些自定義視圖開發渲染毛刺,直到我做了一些事情(如調整窗口大小)以使這些自定義視圖重新繪製。我認爲這是由於AppKit中的某種緩存錯誤造成的,我相信我不是唯一一個獲得這種行爲的人,所以有人知道如何解決它?可可繪製窗口失去時的故障,然後恢復主要狀態

下面是一個例子:

View drawn correctly View drawn with glitch

通知,視圖的背景左側的怪異暗線?即使沒有視圖中的子視圖,也是如此。我在其他一些觀點中發現了其他類似的錯誤。

下面是做繪圖代碼:

void EDDrawGlossEffectInRect(NSRect dirtyRect) { 
    NSRect topRect, bottomRect; 
    NSDivideRect(dirtyRect, &topRect, &bottomRect, (dirtyRect.size.height/2), NSMaxYEdge); 

    [EDLightChromeColor set]; 
    NSRectFill(topRect); 

    [EDMidChromeColor set]; 
    NSRectFill(bottomRect); 
} 

-(void)drawRect:(NSRect)dirtyRect { 
    EDDrawGlossEffectInRect(dirtyRect); 

    NSBezierPath *path = [NSBezierPath bezierPath]; 
    [path setLineWidth:1.0]; 

    NSPoint startPoint = {0, dirtyRect.size.height}; 
    NSPoint endPoint = {dirtyRect.size.width, dirtyRect.size.height}; 

    [path moveToPoint:startPoint]; 
    [path lineToPoint:endPoint]; 

    [[NSColor colorWithCalibratedWhite:0.7 alpha:1] set]; 

    [path stroke]; 
} 

該視圖創建編程,不與界面生成器,這我沒有使用這個項目。

回答

3

dirtyRect不一定會覆蓋您視圖的可見矩形,因此您可能想要查看視圖邊界的哪一部分與dirtyRect相交併重新繪製。否則,只需重新繪製視圖的邊界。調整窗口大小可能會導致整個界限變得很髒(通常情況下),這可能就是爲什麼你在這個時候看到完全重新繪製的原因。

+0

我完全沒有意識到這一點,我猜如果你有一個很大的視圖,裁剪/剪裁等。繪製這個簡單的視圖的一個片段將是痛苦的,可能過度設計,所以我剛剛改變畫出整個邊界,你是正確的,錯誤已經消失。謝謝。 – d11wtq 2010-12-13 04:45:10

+0

如果繪圖成爲使用樂器分析應用程序時的熱點,您可能希望重新訪問該文件。在此之前,我不會擔心過早優化此方法。別客氣。 – 2010-12-13 04:53:19