2013-04-02 55 views
2

目前我正在使用NSView上的Bézier路径绘制一些形状。绘图代码在drawRect:方法上执行并在最后创建图像的位置。使用可可绘制NSImage

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

我的要求是创建一个我需要的图形。

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

回答

2

您必须创建一个NSBitmapImageRep并使用bitmapImageRepForCachingDisplayInRect:通过指定您的视图框架。

将绘制位图图像表示。

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

样本下面是从可可中提取与爱的教程: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,设置获取到NSGraphicsContext 使用graphicsContextWithBitmapImageRep :,锁定焦点你自己和 调用drawRect:直接会避免这些问题,并且更灵活。但它会更多的工作,所以我不打扰这个 示例项目(我主要把这个导出代码放入应用程序,所以我可以 创建应用程序的图标)。

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

+0

纠正我,如果我错了,这段代码会将NSView转换为PNG,不是吗?要创建绘图,-drawRect方法仍然应该执行,不是吗? – user523791

+1

这是标准的方式。但视图**不需要以这种方式显示**。您只需创建视图而不显示它。通常人们在需要打印其视图的特定部分时也是如此。 – Jean

+0

非常感谢您的快速回复 – user523791