目前我正在使用 NSView 上的贝塞尔路径绘制一些形状。绘图代码在 drawRect: 方法上执行并最终创建图像。
我不想在任何地方向用户显示此视图。然而,据我所知,drawRect: 方法只有在我们将视图添加到超级视图并随后在 NSView 上调用 display 或 displayNeedsUpdate 方法时才会被调用。
我的要求是创建所需绘图的图像。
而不是绘制到 NSView 并将其转换为 PNG,有什么方法可以直接绘制图像?
目前我正在使用 NSView 上的贝塞尔路径绘制一些形状。绘图代码在 drawRect: 方法上执行并最终创建图像。
我不想在任何地方向用户显示此视图。然而,据我所知,drawRect: 方法只有在我们将视图添加到超级视图并随后在 NSView 上调用 display 或 displayNeedsUpdate 方法时才会被调用。
我的要求是创建所需绘图的图像。
而不是绘制到 NSView 并将其转换为 PNG,有什么方法可以直接绘制图像?
您必须通过指定视图框架来创建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: 将避免这些问题并且更灵活。但它会做更多的工作,所以我没有为这个示例项目费心(我主要把这个导出代码放到应用程序中,这样我就可以创建应用程序的图标)。
因此,您可以选择最适合您需求的解决方案。