objective-c - 没有上下文的 NSRectFill 会导致调试警告

标签 objective-c cocoa nsview appkit nsrect

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

我读到了一些关于你明确绘制的东西必须在“上下文”内的内容,但我找到的所有文章目前都远远高于我的水平。

这是我的代码:

- (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);
}

我收到这些错误:

Jul 2 16:10:49 localhost X[27220] : CGContextSetFillColorWithColor: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextSetStrokeColorWithColor: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextSetFillColorWithColor: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextSetStrokeColorWithColor: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextGetCompositeOperation: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextSetCompositeOperation: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextFillRects: invalid context 0x0

Jul 2 16:10:49 localhost X[27220] : CGContextSetCompositeOperation: invalid context 0x0

大多数文章都讨论了使用“NSGraphicsContext”,但所有文章都是理论性的,我找不到如何使其发挥作用的示例。

希望有人能帮忙:)

最佳答案

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

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

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

关于objective-c - 没有上下文的 NSRectFill 会导致调试警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295481/

相关文章:

iphone - 在 iphone 应用程序的 InApp 购买中检索产品列表时出现问题

ios - 构建时错误 : Receiver type * for for instance message is a forward declaration

ios - UICollectionView-尝试删除并重新加载相同的索引路径

cocoa - Kiosk 应用程序 - OS X 编程 - 多显示器

objective-c - 响应 "Hide Others"Mac OS X

macos - 如何删除或替换Interface Builder中自动添加的NSView?

macos - 如何在Swift语言中改变NSView的圆角半径

cocoa - 从缩放 View 拖动时 NSView 图像损坏

iphone - 如何提高 iOS 应用程序的性能?

macos - 从 NSDocument 类访问主窗口