NSView的绘图上下文

时间:2012-02-27 23:02:44

标签: objective-c macos cocoa core-graphics quartz-2d

-drawRect:获取NSView的CGContext并使用它以后执行更多绘图是否安全?在像这样的简单测试中:

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:的标准绘图方式。它适用于各种各样的场合,但是在我的特定情况下,更加程序化的绘图方式会使生活更轻松。

2 个答案:

答案 0 :(得分:7)

你不应该这样做。上下文不保证存在于drawRect:之外,并且您的绘图代码工作的事实是一个幸福的事故。不要依赖这种行为。

如果您需要随时强制绘图,则应在视图上调用display,然后再调用drawRect:

答案 1 :(得分:2)

如果你想在外面lockFocus:画画,你需要使用drawRect: 以下是NSView的文档摘录:

  

如果您不使用display ...方法绘制NSView对象,那么   必须在调用发送命令的方法之前调用lockFocus   窗口服务器,并且必须与unlockFocus消息进行平衡   完成后。

     

隐藏或小型化一次性窗口会导致后备存储   那个窗口要发布。如果您不使用标准显示器   要绘制的机制,你应该使用lockFocusIfCanDraw而不是   如果在窗口可能的情况下有可能绘制,则锁定焦点   小型化或隐藏。