强制NSView绘图的行为就像显示是视网膜一样

时间:2014-03-15 05:26:42

标签: ios macos nsview nsimage retina

我有一个自定义NSView,可以在我的应用中绘制图表。我正在生成包含图像的PDF。在iOS中,我使用以下代码执行此操作:

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
[self drawRect:self.frame];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

在iOS中,显示器是视网膜,这意味着图像的分辨率非常高,但是,我现在正在尝试在我的Mac应用程序中执行此操作,并且图像的质量很差,因为非视网膜Mac将生成非-high res版本的图像。

当我使用它来生成图像时,我想强制我的NSView表现得像是视网膜。这样,当我将图像放入我的PDF时,它的分辨率会更高。现在,它非常模糊,没有吸引力。

2 个答案:

答案 0 :(得分:0)

即使是Retina位图在放大到足够的时候仍然会模糊不清并且没有吸引力。假设视图在drawRect:中绘制其内容,而不是尝试以固定分辨率将视图渲染为PDF,更好的方法是直接绘制到PDF graphics context。这将产生一个很好的可扩展PDF。绘图代码需要考虑因素,因此它可以用于视图的drawRect:和PDF。

此外,iOS文档声明您不应该自己致电drawRect:。在视图的图层上调用renderInContext:,或使用较新的drawViewHierarchyInRect:afterScreenUpdates:

答案 1 :(得分:0)

您可以致电-[NSView dataWithPDFInsideRect:]从视图中的绘图中获取PDF数据。例如:

NSData* data = [someView dataWithPDFInsideRect:someView.bounds];
[data writeToFile:@"/tmp/foo.pdf" atomically:YES];

您的视图及其子视图所做的任何矢量绘图(例如文本,Bezier路径等)都将最终作为PDF中的可缩放矢量图形。