首页 > 解决方案 > 如何在 Mac 而不是 iPhone 上创建和打印屏幕外 SwiftUI 视图

问题描述

一个多星期以来,我一直在尝试解决我正在使用 Swift 和 SwiftUI 编写的 macOS 应用程序中的打印问题。

我需要打印一个视图,我已将其设为主窗口,但这对用户不起作用。数据可以来自文件或直接来自用户输入,因此可以是 1 到 100 个数据集。

因为我正在打印主窗口,所以应用程序在打印过程中无法使用,这是不可接受的。

理想的解决方案是在屏幕外创建视图,然后打印视图。这样,除了打印机输出的东西之外,用户永远不会看到它!

我试图找出如何打印不是主窗口的视图 - 没有成功,尝试创建第二个窗口设法创建窗口但不打印它!

发布代码没有意义,因为不知道我尝试过的几种方法中的哪一种可以工作,甚至不确定我现在尝试做的事情是否可行!

请在 Mac 上注意这一点,而不是 iPhone 或 iPad!

标签: swiftmacosprintingswiftui

解决方案


这对我有用,是从@Willeke 评论中的链接借来的。它涉及转换为用于打印的位图。

let printInfo = NSPrintInfo()

let view = ContentView()
let contentRect = NSRect(x: 0, y: 0, width: 1080, height: 720) // these values will vary

let viewToPrint = NSHostingView(rootView: view)
viewToPrint.frame = contentRect

let bitMap = viewToPrint.bitmapImageRepForCachingDisplay(in: contentRect)!
viewToPrint.cacheDisplay(in: contentRect, to: bitMap)

let image = NSImage(size: bitMap.size)
image.addRepresentation(bitMap)

let imageView = NSImageView(frame: contentRect)
imageView.image = image

let printOperation = NSPrintOperation(view: imageView, printInfo: self.printInfo)
printOperation.showsPrintPanel = true
printOperation.showsProgressPanel = true
printOperation.run()

推荐阅读