如何打印一个SwiftUI视图

6

我想使用SwiftUI View在macOS(Ventura)上打印类似标签的东西。但是这导致纸张为空白:

func startPrinting() {
    let printView = NSHostingView(rootView: Text("I want to print"))
    printView.frame.size = CGSize(width: 200, height: 200)

    let printInfo = NSPrintInfo()
    printInfo.topMargin = 0
    printInfo.leftMargin = 0
    printInfo.bottomMargin = 0
    printInfo.rightMargin = 0

    let printOperation = NSPrintOperation(view: printView, printInfo: printInfo)
    printOperation.run()
}

当我将 Text 切换为 TextField 时,它被打印出来了,但我不知道为什么。

如何打印一个 SwiftUI 视图?


1
和我一样。在 macOS 12 上可以正常工作,看起来是 Ventura 中的一个错误。 - undefined
根据发布说明,看起来这个问题在 macOS 13.5 和 macOS 14 上已经修复了。您还遇到这个问题吗? - undefined
@Jake3231:是的,你说得对。对我来说,问题也解决了。 - undefined
1个回答

0
我还想打印一个SwiftUI视图。在我的情况下,是一个带注释的地图视图。网上似乎没有太多建议。我尝试使用Xcode 14和Xcode 15提供的函数来打印一个ContentView,但结果类似,没有完整的解决方案。
import SwiftUI

func startPrinting() {
    let printView = NSHostingView(rootView: ContentView())
    printView.frame.size = CGSize(width: 200, height: 200)

    let printInfo = NSPrintInfo()
    printInfo.topMargin = 0
    printInfo.leftMargin = 0
    printInfo.bottomMargin = 0
    printInfo.rightMargin = 0

    let printOperation = NSPrintOperation(view: printView, printInfo: printInfo)
    printOperation.run()
}

// 来自: 如何打印一个SwiftUI视图
struct ContentView: View {
    
    @State var someText = "Text here"
    
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text(someText)
            TextField("A textfield", text: $someText)
            Button("Print this View") {
                startPrinting()
            }
        }
        .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

更改rootView允许在ContentView中打印一些元素。但不包括地球和文本字段中输入的文本。它确实包括了打印预览窗格中的文本内容、文本字段的提示和按钮文本。

你可以使用MKMapSnapshotter来捕捉和打印地图视图。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接