2012-02-27 67 views
6

-drawRect:獲取NSView的CGContext並將其用於以後執行更多繪圖是否安全?在一個簡單的測試,像這樣的:NSView的繪圖上下文

CGContextRef context = NULL; 

- (void)drawRect:(NSRect)r 
{ 
    if (!context) 
     context = [[NSGraphicsContext currentContext] graphicsPort]; 
} 

- (void)drawSomething 
{ 
    CGContextSetRGBFillColor(context, 1, 0, 0, 1); 
    CGContextFillRect(context, CGRectMake (0, 0, 100, 100)); 
    CGContextFlush(context); 
} 

一切似乎當-drawSomething被調用的工作,但它是保證的背景下會不會改變?你可以看到並可能猜到,我試圖繞過使用-drawRect:繪圖的標準方式。它適用於許多場合,但更多的程序化繪圖方式會讓我的生活變得更輕鬆。

回答

6

你不應該這樣做。上下文不保證存在於drawRect:以外,並且您的繪圖代碼正在運行的事實是一個令人高興的事故。不要依賴這種行爲。

如果您需要在任何時候強制繪圖,則應在視圖上調用display,該視圖將依次調用drawRect:

2

您需要使用lockFocus:如果你想外面drawRect: 得出下面是從NSView文件摘錄:

如果不使用顯示器...方法來繪製的NSView對象,您在調用窗口服務器發送命令到 的方法之前必須調用lockFocus,並且必須在完成時使用unlockFocus消息 來平衡它。

隱藏或小型化一次性窗口會導致後臺存儲 該窗口被釋放。如果您不使用標準顯示器 機制進行繪製,則應該使用lockFocusIfCanDraw而不是 lockFocus,如果在小窗口或隱藏窗口爲 時有機會繪圖。