0

我想将 NSTableVIew 数据打印为多页打印预览,但打印预览仅显示前几条记录,其余页面为空。我正在使用以下代码打印 NStableView 数据。

let printInfo = NSPrintInfo.shared
printInfo.paperSize = NSSize(width: self.reporttableview.frame.width , height: 800.00)
printInfo.verticalPagination = .automatic
let operation: NSPrintOperation = NSPrintOperation(view: self.reporttableview, printInfo: printInfo)
operation.printPanel.options.insert([.showsPaperSize, .showsOrientation])
operation.run()

上面的代码工作正常,最少记录如 30 -40 行,但当记录大约 100 或超过 100 时,它只打印前几条记录,其余页面为空。任何帮助将不胜感激。我附上了表格视图和打印预览屏幕截图为了更好地理解。

  1. TableView 记录: 表格视图屏幕截图
  2. 打印预览: 打印预览屏幕截图 您可以在上面的屏幕截图中看到只有前几页有记录其余部分是空的。如果我在这种情况下滚动表格视图,整个打印预览是空的。 空打印预览屏幕截图

我无法理解我做错了什么。

4

1 回答 1

0

我有同样的问题。我相信这是由 AppKit 用来有效显示 NSTableViews 的方法引起的。这似乎通过只为大约 3 个视图“页面”生成显示数据来优化,即减少大型 NSTableViews 的内存负载。要打印整个 NSTableView,请在打印var usesStaticContents: Bool { get set }前将 NSTableView 实例属性设置为 true(打印完成后将其值返回为 false)。我已经在一张 33 x A4 横向页面的表格上成功地测试了它,它工作正常(尽管在显示打印面板之前需要大约 5 秒)。

这是对我有用的代码:

struct ReportsDetailView: View {
        
    @Binding var reportNodes: [ReportNode]
    @State private var viewToPrint = NSView()
    @State private var printing = false

    var body: some View {
        VStack {
            ReportsDetailTableVC(reportNodes: $reportNodes, viewToPrint: $viewToPrint, printing: $printing)
            HStack {
                Spacer()
                Button("Print Report") {
                    printing = true
                    let scale: CGFloat = 800/viewToPrint.frame.width
                    let printInfo = NSPrintInfo()
                    printInfo.horizontalPagination = .automatic
                    printInfo.verticalPagination = .automatic
                    printInfo.isVerticallyCentered = true
                    printInfo.isHorizontallyCentered = true
                    printInfo.printer = NSPrinter(name: NSPrinter.printerNames[0])!
                    printInfo.paperSize = NSSize(width: 595.28, height: 841.89)
                    printInfo.topMargin = 10
                    printInfo.bottomMargin = 10
                    printInfo.leftMargin = 10
                    printInfo.rightMargin = 10
                    printInfo.orientation = .landscape
                    printInfo.scalingFactor = scale
                    let printOperation = NSPrintOperation(view: viewToPrint, printInfo: printInfo)
                    printOperation.run()
                    printing = false
                }
                .disabled(printing)
            }
            .padding(10)
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct ReportsDetailTableVC: NSViewControllerRepresentable {
    
    @Environment(\.colorScheme) var colorScheme
    
    @Binding var reportNodes: [ReportNode]
    @Binding var viewToPrint: NSView
    @Binding var printing: Bool
    
    func makeNSViewController(context: Context) -> some NSViewController {
        let reportsDetailVC = ReportsDetailTableViewController()
        return reportsDetailVC
    }
    
    func updateNSViewController(_ nsViewController: NSViewControllerType, context: Context) {
        guard let reportsDetailVC = nsViewController as? ReportsDetailTableViewController else {return}
        reportsDetailVC.setContents(reportNodes: reportNodes)
        if printing {
            reportsDetailVC.tableView.scrollRowToVisible(0)
            reportsDetailVC.tableView.usesStaticContents = true
            reportsDetailVC.tableView.appearance = NSAppearance(named: .aqua)
            reportsDetailVC.tableView.usesAlternatingRowBackgroundColors = false
        }
        else {
            reportsDetailVC.tableView.usesStaticContents = false
            reportsDetailVC.tableView.appearance = colorScheme == .light ? NSAppearance(named: .aqua) : NSAppearance(named: .darkAqua)
            reportsDetailVC.tableView.usesAlternatingRowBackgroundColors = true
        }
        DispatchQueue.main.async {viewToPrint = reportsDetailVC.tableView}
    }
}
于 2021-06-27T08:59:10.653 回答