从-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:
的标准绘图方式。它适用于各种各样的场合,但是在我的特定情况下,更加程序化的绘图方式会使生活更轻松。
答案 0 :(得分:7)
你不应该这样做。上下文不保证存在于drawRect:
之外,并且您的绘图代码工作的事实是一个幸福的事故。不要依赖这种行为。
如果您需要随时强制绘图,则应在视图上调用display
,然后再调用drawRect:
。
答案 1 :(得分:2)
如果你想在外面lockFocus:
画画,你需要使用drawRect:
以下是NSView的文档摘录:
如果您不使用display ...方法绘制NSView对象,那么 必须在调用发送命令的方法之前调用lockFocus 窗口服务器,并且必须与unlockFocus消息进行平衡 完成后。
隐藏或小型化一次性窗口会导致后备存储 那个窗口要发布。如果您不使用标准显示器 要绘制的机制,你应该使用lockFocusIfCanDraw而不是 如果在窗口可能的情况下有可能绘制,则锁定焦点 小型化或隐藏。