swift UIPrintPageRenderer printableRect.size.width 始终为零 (0)

swift UIPrintPageRenderer printableRect.size.width is always zero (0)

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

本质上,我想并排打印两个多行属性字符串,就像两列一样(最终,我想将一个嵌入另一个并环绕起来,但不要让领先于我们这里)。右侧文本视图必须根据其内容固定大小(其子类覆盖 sizeToFit() 以实现此目的)。左侧文本视图应填充剩余宽度。

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

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

但是,它们打印在彼此之上,都在页面的左边缘。

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

时得到 0 (零)

为什么我的 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)
    }
}

我已经弄明白了。似乎 paperRect 和 printableRect 属性在 init() 时间不可用(这是我从 addThing() 调用的地方)。

我必须通过覆盖其他函数之一来完成这项工作,例如 drawPrintFormatter()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)
    }