NSView 到 PDF 和 PNG:为什么结果如此不同?

NSView to PDF and PNG: Why is the outcome so different?

我正在尝试将 NSView 保存到 PNG。 我从 NSView 开始,然后为 PNG 调用 dataWithPDFcacheDisplay。执行这两项操作的代码如下所示。

guard view.lockFocusIfCanDraw() else {
    assert (false)
    return
}
let pdfData = view.dataWithPDF(inside: rect)
guard let imgData = view.bitmapImageRepForCachingDisplay(in: rect) else {
    assert(false)
}
view.cacheDisplay(in: rect, to: imgData)
view.unlockFocus()
try pdfData.write(to: pdfName, options: .atomic)
let pngData = imgData.representation(using: .png, properties: [:])
try pngData!.write(to: pngName, options: .atomic)

到目前为止,还不错。然而,这是不同的结果。 PDF(正确!) 这是 PNG 输出。可以看到,不包括子视图。箭头是作为 view 的一部分绘制的

为什么结果如此不同?

非常感谢!

Why is the outcome so different?

使用不同的(我显然没有你的视图)视图和子视图尝试你的代码按预期工作并且 PNG 很好。所以它必须与你的观点有关,但我不能就什么提出任何建议。然而...

当你有有效的 PDF 数据时,你可以使用类似的东西从中生成你的 PNG:

let captured = NSImage(data:pdfData)
let rep = NSBitmapImageRep(data:(captured?.tiffRepresentation)!)
let pngData = rep?.representation(using: NSPNGFileType, properties:[:])

(即 Swift 3,因此 NSPNGFileType 而不是 .png

这当然不能解决您遇到的任何问题,它可以避免它:-)您应该真正弄清楚为什么您的观点失败了,并将其视为临时的创可贴(假设它对您有用... ).

HTH

好的,我找到了答案。多亏了 "View Debugging",我才看到子视图使用了一层 (self.wantsLayer = true)。图层并没有进入 PNG,而是进入 PDF。不确定这是错误还是功能。但是,现在我可以修复 PNG 输出。