1

我目前正在制作一个 macOS 应用程序,并且正在尝试支持打印。我添加了 NSBox 来表示我想在 NSScrollView 中打印的页面,所以层次结构看起来像这样

NSScrollView
|- NSDocumentView
   |- NSBox
   |- NSBox

打印预览

在 ViewController 中,当用户单击打印时,我运行以下代码

let printOperation = NSPrintOperation(view: self.previewView, printInfo: printInfo)

if let window = self.view.window {
    printOperation.runModal(for: window, delegate: self, didRun: #selector(PrintPreviewViewController.printOperationDidRun(_:success:contextInfo:)), contextInfo: nil)
}

在 NSDocumentView 子类中,我实现了

override func knowsPageRange(_ range: NSRangePointer) -> Bool {

    var numberOfPages = 0

    for i in 0..<pages.count {
        numberOfPages += pages[i].count
    }

    range.pointee.location = 1
    range.pointee.length = numberOfPages

    return true
}

override func rectForPage(_ page: Int) -> NSRect {

    var pageNumber = 1

    for i in 0..<pages.count {
        for j in 0..<pages[i].count {

            if pageNumber == page {
                return pages[i][j].frame
            }
            pageNumber += 1
        }
    }

    return NSRect(x: 0, y: 0, width: 300, height: 300)

}

当我跑步时,我看到所有看起来都正确的打印纸。

打印表

但是当我最终确认打印时,我在控制台中得到了这些错误,还有一张白纸。

CGContextGetCTM: invalid context 0x0
CGContextTranslateCTM: invalid context 0x0

我不知道这意味着什么,因为所有内容都在 NSScrollView 中正确显示,甚至是打印预览。我试图缩小问题的范围,我尝试在 NSScrollView 中只使用一个 NSBox 制作一个空白项目,但我遇到了同样的问题。我尝试更改在 rectForPage() 中返回的 NSRect bering 的大小,但没有任何效果。我没主意了。

谢谢大家。

4

0 回答 0