2012-02-27 95 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,如果在小窗口或隐藏窗口为 时有机会绘图。