0

UIActivityViewController を使用して印刷しています(他のアクティビティの中でも)。そのため、UIPrintPageRenderer のカスタム サブクラスのインスタンスを渡します。関連するコードは以下のとおりです。

本質的に、2 つの複数行の属性付き文字列を 2 つの列のように並べて出力したい (最終的には、一方を他方に埋め込んでラップしたいのですが、ここで先を越さないでください) . 右側のテキスト ビューは、そのコンテンツに応じて固定サイズにする必要があります (そのサブクラスは sizeToFit() をオーバーライドしてこれを実現します)。左側のテキスト ビューは、残りの幅を埋める必要があります。

そのため、属性付きの文字列が取り込まれた UITextView インスタンスを使用し、それぞれの .viewPrintFormatter()` 出力を UIPrintFormatters として UIPrintPageRenderer に割り当てています。

これは部分的に機能します。両方の属性文字列がページに印刷されます。

ただし、両方ともページの左端に重ねて印刷されます。

UIEdgeInsets を使用して印刷を制限しようとすると、値をハードコードしない限り失敗します。これは0printableRect.size.width.

UIPrintPageRendere の printableRect の幅が常にゼロなのはなぜですか?

2 つの複数行属性文字列を並べて印刷する正しい方法は何ですか?

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 に答える