0

我正在使用 UIActivityViewController 进行打印(在其他活动中)​​。因此,我将我的 UIPrintPageRenderer 的自定义子类的实例传递给它,相关代码如下。

本质上,我想并排打印两个多行属性字符串,就像两列一样(最终,我希望将一个嵌入另一个并包裹起来,但我们不要在这里超越自己) . 右侧文本视图必须根据其内容固定大小(其子类覆盖 sizeToFit() 来实现这一点)。左侧文本视图应填充剩余的宽度。

所以我使用 UITextView 实例,填充属性字符串,并将它们各自的 .viewPrintFormatter()` 输出作为 UIPrintFormatters 分配给 UIPrintPageRenderer。

这部分有效。两个属性字符串都打印在页面上。

但是,它们在页面的左边缘打印在彼此的顶部。

我尝试使用 UIEdgeInsets 来限制它们的打印失败,除非我硬编码值。看来这是因为我0在查询printableRect.size.width.

为什么我的 UIPrintPageRendere 的 printableRect 总是零宽度?

实现两个多行属性字符串并排打印的正确方法是什么?

class CustomPrintPageRenderer: UIPrintPageRenderer {
    let leftTextView = UITextView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    let rightTextView = IngredientsTextView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))

    init(_ thing: Thing) {
        super.init()
        addThing(thing)
    }

    func addThing(_ thing: Thing) {
        //  Do some stuff here to populate the two text views with attributed strings
        //  ...
        //  ...
        rightTextView.sizeToFit()
        let leftPrintFormatter = leftTextView.viewPrintFormatter()
        let rightPrintFormatter = rightTextView.viewPrintFormatter()
        print(paperRect.size.width)
        print(printableRect.size.width)
        rightPrintFormatter.perPageContentInsets = UIEdgeInsets(top: formatter.titleFontSize, left: printableRect.size.width - rightTextView.frame.size.width, bottom: 0, right: 0)
        leftPrintFormatter.perPageContentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: rightTextView.frame.size.width)

        addPrintFormatter(leftPrintFormatter, startingAtPageAt: numberOfPages)
        addPrintFormatter(rightPrintFormatter, startingAtPageAt: numberOfPages)
    }
}
4

1 回答 1

1

我已经想通了。似乎 paperRect 和 printableRect 属性init()当时不可用(这是我打电话给我addThing()的地方)。

我必须通过覆盖其他功能之一来完成这项工作,例如drawPrintFormatter()or numberOfPages()

这主要按预期工作:

    override func drawPrintFormatter(_ printFormatter: UIPrintFormatter, forPageAt pageIndex: Int) {
        if printFormatter == rightPrintFormatter {
            printFormatter.perPageContentInsets = UIEdgeInsets(top: RecipeFormatter.titlePrintTextSize, left: printableRect.size.width - ingrWidth, bottom: 0, right: 0)
        } else if printFormatter == leftPrintFormatter {
            printFormatter.perPageContentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: ingrWidth)
        }
        super.drawPrintFormatter(printFormatter, forPageAt: pageIndex)
    }
于 2020-03-15T03:29:41.533 回答