2

目前我正在使用 NSView 上的贝塞尔路径绘制一些形状。绘图代码在 drawRect: 方法上执行并最终创建图像。

我不想在任何地方向用户显示此视图。然而,据我所知,drawRect: 方法只有在我们将视图添加到超级视图并随后在 NSView 上调用 display 或 displayNeedsUpdate 方法时才会被调用。

我的要求是创建所需绘图的图像。

而不是绘制到 NSView 并将其转换为 PNG,有什么方法可以直接绘制图像?

4

1 回答 1

2

您必须通过指定视图框架来创建NSBitmapImageRep和使用。bitmapImageRepForCachingDisplayInRect:

将绘制位图图像表示。

然后,您只需要使用representationUsingType:NSPNGFileType properties:nil并将结果写入文件。

下面的示例摘自 cocoa with love 的教程:Advanced drawing using AppKit

NSRect iconViewFrame = iconView.frame;
[iconView setFrame:[iconView nativeRect]];

NSBitmapImageRep *bitmapImageRep =
    [iconView bitmapImageRepForCachingDisplayInRect:[iconView frame]];
[iconView
    cacheDisplayInRect:[iconView bounds]
    toBitmapImageRep:bitmapImageRep];
[[bitmapImageRep representationUsingType:NSPNGFileType properties:nil]
    writeToURL:[savePanel URL]
    atomically:YES];

[iconView setFrame:iconViewFrame];

他们还建议:

创建自己的 NSBitmapImageRep,使用 graphicsContextWithBitmapImageRep: 设置 NSGraphicsContext,自己锁定焦点并直接调用 drawRect: 将避免这些问题并且更灵活。但它会做更多的工作,所以我没有为这个示例项目费心(我主要把这个导出代码放到应用程序中,这样我就可以创建应用程序的图标)。

因此,您可以选择最适合您需求的解决方案。

于 2013-04-02T17:08:33.340 回答