【问题标题】:Unable To Print Multipage Print Preview With NStableView Data Cocoa App无法使用 NStableView Data Cocoa App 打印多页打印预览
【发布时间】:2021-05-25 15:27:15
【问题描述】:

我想将 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 时,它只打印前几条记录,其余页面为空。任何帮助将不胜感激。我附上了 tableview 和 Print预览屏幕截图以便更好地理解。

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

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

【问题讨论】:

  • 您尝试做的事情听起来与尝试打印滚动视图中的全部内容相同。
  • 是的@ElTomato,你是对的,但是当我尝试打印整个 ScrollView 时,它唯一的打印滚动视图现有框架区域。我还尝试将 Tableview 框架分配给滚动视图内容偏移,但没有任何效果。
  • 我试过你的代码,所有的行都打印出来了。请发minimal reproducible example
  • @Willeke 请在表格视图中尝试至少 100 条记录。有限的数据(例如 30 - 40 条记录)可以正常工作。
  • 我尝试了 100 和 10000 行。是否可以在小型测试项目中重现该问题?

标签: swift macos cocoa nstableview nsprintoperation


【解决方案1】:

我遇到了同样的问题。我相信这是由 AppKit 用来有效显示 NSTableViews 的方法引起的。这似乎通过仅生成视图的大约 3 个“页面”的显示数据来优化,即减少大型 NSTableView 的内存负载。要打印整个 NSTableView,请在打印前将 NSTableView 实例属性var usesStaticContents: Bool { get set } 设置为 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}
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多