【问题标题】:NSView's Drawing ContextNSView 的绘图上下文
【发布时间】:2012-02-27 23:02:44
【问题描述】:

-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: 的标准绘图方式。它适用于无数场合,但在我的特殊情况下,更程序化的绘图方式会让生活更轻松。

【问题讨论】:

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


    【解决方案1】:

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

    如果你需要在任何时候强制绘制,你应该在视图上调用display,而视图又会调用drawRect:

    【讨论】:

    • 第一次处理 NSGraphicsContext 时很难弄清楚。感谢您的回答并向许多人指出这一点!
    【解决方案2】:

    如果你想在drawRect:之外绘图,你需要使用lockFocus: 这是NSView文档的摘录:

    如果你不使用 display... 方法来绘制一个 NSView 对象,你 必须在调用发送命令的方法之前调用 lockFocus 窗口服务器,并且必须通过 unlockFocus 消息来平衡它 完成后。

    隐藏或缩小一次性窗口会导致后备存储 那个窗口被释放。如果您不使用标准显示器 绘制机制,你应该使用 lockFocusIfCanDraw 而不是 lockFocus 如果有可能在窗口处于绘制状态时绘制 小型化或隐藏。

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 2011-04-26
      • 2013-01-12
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多