0

我正在尝试使用 NSRect 在 Objective-C 中绘图,但我在网上找到的所有示例都会在输出日志中产生警告。它确实利用了视图,但我想看看调试器没有报告任何问题:)。

我读过一些关于你明确绘制的东西必须在“上下文”中的东西,但我发现的所有文章目前都远远超出了我的水平。

这是我的代码:

- (void)drawRect:(NSRect)rect
{
    NSColor *white = [NSColor whiteColor];
    NSColor *blue = [NSColor blueColor];
    
    [white set];
    NSRectFill([self bounds]);
    
    rect = NSMakeRect(100, 100, 50, 50);
    [blue set];
    NSRectFill(rect);
}

我收到这些错误:

7 月 2 日 16:10:49 localhost X[27220]:CGContextSetFillColorWithColor:无效上下文 0x0

7 月 2 日 16:10:49 本地主机 X[27220]:CGContextSetStrokeColorWithColor:无效上下文 0x0

7 月 2 日 16:10:49 localhost X[27220]:CGContextSetFillColorWithColor:无效上下文 0x0

7 月 2 日 16:10:49 本地主机 X[27220]:CGContextSetStrokeColorWithColor:无效上下文 0x0

7 月 2 日 16:10:49 localhost X[27220]:CGContextGetCompositeOperation:无效上下文 0x0

7 月 2 日 16:10:49 localhost X[27220]:CGContextSetCompositeOperation:无效上下文 0x0

7 月 2 日 16:10:49 localhost X[27220]:CGContextFillRects:无效上下文 0x0

7 月 2 日 16:10:49 localhost X[27220]:CGContextSetCompositeOperation:无效上下文 0x0

大多数文章都谈到了使用“NSGraphicsContext”,但都是理论上的,我找不到如何让它发挥作用的例子。

我希望有人能帮帮忙 :)

4

1 回答 1

2

执行绘图操作时,需要提供图形上下文。上下文是绘画将发生的地方,就像绘画的画布。

图形上下文由类的实例NSGraphicsContext或其 CoreGraphics 低级对应物管理CGContextRef。大多数 Cocoa 绘图方法都在当前上下文中运行。如果要为绘图操作创建自定义上下文,可以使用 获取当前上下文+[NSGraphicsContext currentContext]并使用+[NSGraphicsContext setCurrentContext:].

但是当您实现时-[NSView drawRect:]您不需要处理图形上下文。为什么?因为NSView在调用您的实现之前会自动创建一个上下文并将其设置为当前上下文,drawRect:然后检索绘制的内容并将其显示在屏幕上。明显的警告是你不能drawRect:直接调用:相反,drawRect:当它需要显示视图时,Cocoa 会调用你的实现。它是自动完成的。您唯一能做(并且需要做)的事情是使用-[NSView setNeedsDisplay:]带有参数的方法告诉视图何时需要重新显示(即,当其绘制的内容发生变化时) YES

于 2012-07-02T16:03:02.917 回答