目前我正在使用NSView上的Bézier路径绘制一些形状。绘图代码在drawRect:方法上执行并在最后创建图像的位置。使用可可绘制NSImage
我不想在任何地方向用户显示此视图。然而,正如我所知,当我们将视图添加到超级视图,然后在NSView上调用display或displayNeedsUpdate方法时,drawRect:方法只会被调用。
我的要求是创建一个我需要的图形。
而不是绘制到NSView并将其转换为PNG,有没有什么办法可以直接绘制图像?
目前我正在使用NSView上的Bézier路径绘制一些形状。绘图代码在drawRect:方法上执行并在最后创建图像的位置。使用可可绘制NSImage
我不想在任何地方向用户显示此视图。然而,正如我所知,当我们将视图添加到超级视图,然后在NSView上调用display或displayNeedsUpdate方法时,drawRect:方法只会被调用。
我的要求是创建一个我需要的图形。
而不是绘制到NSView并将其转换为PNG,有没有什么办法可以直接绘制图像?
您必须创建一个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:直接会避免这些问题,并且更灵活。但它会更多的工作,所以我不打扰这个 示例项目(我主要把这个导出代码放入应用程序,所以我可以 创建应用程序的图标)。
因此,您可以选择最适合您需求的解决方案。
纠正我,如果我错了,这段代码会将NSView转换为PNG,不是吗?要创建绘图,-drawRect方法仍然应该执行,不是吗? – user523791
这是标准的方式。但视图**不需要以这种方式显示**。您只需创建视图而不显示它。通常人们在需要打印其视图的特定部分时也是如此。 – Jean
非常感谢您的快速回复 – user523791