【问题标题】:Force NSView drawing to behave as if display is retina强制 NSView 绘图表现得好像显示是视网膜
【发布时间】:2014-03-15 05:26:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在 OS X 中如何操作的代码在哪里?
  • 如果没有更多关于生成 PDF 的上下文(导出 PDF 是程序的最终用户功能,还是只是为文档制作屏幕截图?),我不知道这个提示是否有用,但请查看 HiDPI 模式:stackoverflow.com/questions/12124576/…
  • 这是一个最终用户功能。我的应用程序会根据输入生成一些信息,并且可以以 PDF 格式导出所有信息,以便他们可以保留/保存/通过电子邮件发送/等等。

标签: ios macos nsview nsimage retina


【解决方案1】:

当放大到足够大时,即使是 Retina 位图也会变得模糊且没有吸引力。假设视图在drawRect: 中绘制其内容,而不是试图以固定分辨率将视图呈现为PDF,更好的方法是直接绘制到PDF graphics context 中。这将产生一个很好的可扩展 PDF。绘图代码需要被分解,以便它可以用于视图的drawRect: 和 PDF。

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

【讨论】:

    【解决方案2】:

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

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

    您的视图及其子视图所做的任何矢量绘图(例如文本、贝塞尔路径等)最终都会在 PDF 中作为可缩放矢量图形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多