我正在努力保护max
到PNG。
我从NSView
开始,然后为PNG致电NSView
或dataWithPDF
。做这两件事的代码看起来像这样。
cacheDisplay
到目前为止,这么好。然而,这是不同的结果。
PDF(正确!)
这是PNG输出。可以看出,子视图不包括在内。箭头是
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)
的一部分绘制的
为什么结果如此不同?
非常感谢提前!
答案 0 :(得分:1)
好的,我找到了答案。感谢“查看调试”,我发现子视图使用了一个图层(self.wantsLayer = true
)。并且图层不会进入PNG,而是进入PDF。不确定这是一个错误还是一个功能。但是,现在我可以修复PNG输出。
答案 1 :(得分:0)
为什么结果如此不同?
使用不同的(我显然没有您的视图)使用子视图查看代码按预期工作并且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