如何打印 SwiftUI 视图

Jin*_*Jin 6 macos appkit swift swiftui

我想使用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()
}
Run Code Online (Sandbox Code Playgroud)

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

如何打印SwiftUI视图?

小智 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()
}
Run Code Online (Sandbox Code Playgroud)

// 来自:如何打印 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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