objective-c – 打印NSDocument

前端之家收集整理的这篇文章主要介绍了objective-c – 打印NSDocument前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试打印文档.该文档是一个NS ImageReps数组,或一个NSPDFImageRep数组,它有多个页面.我无法弄清楚如何使用NSPrintOperation类来打印它.

NSPrintOperation似乎需要NSView才能打印.我是否需要在计算位置手动将每个图像添加到视图中,然后让它进行分页?这似乎不符合Cocoa的精神……是否有一些我缺少的技术?

解决方法

尽管有一个公认的答案,它并没有真正回答基本问题,只是给出一个解决方法.

我只是遇到了类似的问题(我有一个对象数组,每个对象都由同一个NSView子类呈现,每页一个).这就是我如何解决它,没有巴洛克式的废话创建一个包含所有页面的巨大视图……

1)我们有一个NSView子类,它有一个与之关联的模型(在你的情况下是NSImage,在我的情况下是ModelData)

class BaseView: NSView {
    var modelData: ModelData /* Whatever your view needs to draw */
    //...
}

2)我们在文档控制器中有一个数组var模型:[ModelData].

3)创建一个新的子类,它将成为打印机视图.

class PrinterView: BaseView {
    var pageIndex: Int = 1
    var modelArray: [ModelData]

    init(frame: NSRect,models: [ModelData]) {
        self.modelArray = models
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        fatalError("invalid initializer")
    }

    override func knowsPageRange(_ range: NSRangePointer) -> Bool {
        range.pointee.location = 1
        range.pointee.length = self.modelArray.count
        return true
    }

    override func rectForPage(_ page: Int) -> NSRect {
        self.pageIndex = page
        return self.bounds
    }

    override func draw(_ dirtyRect: NSRect) {
        self.model = self.modelArray[self.page - 1] // Pages are 1,not 0,based
        super.draw(dirtyRect)
    }
} // That's it! That's all...

4)在文档控制器中执行此操作:

override func printOperation(withSettings printSettings: [String : Any]) throws -> NSPrintOperation {
    self.printInfo.horizontalPagination = .fitPagination
    self.printInfo.verticalPagination = .clipPagination
    let printView = PrinterView(size: self.printInfo.paperSize,models: self.models)

    return NSPrintOperation(view: printView,printInfo: self.printInfo)
}

猜你在找的cocoa相关文章