UIActivityViewController を使用して印刷しています(他のアクティビティの中でも)。そのため、UIPrintPageRenderer のカスタム サブクラスのインスタンスを渡します。関連するコードは以下のとおりです。
本質的に、2 つの複数行の属性付き文字列を 2 つの列のように並べて出力したい (最終的には、一方を他方に埋め込んでラップしたいのですが、ここで先を越さないでください) . 右側のテキスト ビューは、そのコンテンツに応じて固定サイズにする必要があります (そのサブクラスは sizeToFit() をオーバーライドしてこれを実現します)。左側のテキスト ビューは、残りの幅を埋める必要があります。
そのため、属性付きの文字列が取り込まれた UITextView インスタンスを使用し、それぞれの .viewPrintFormatter()` 出力を UIPrintFormatters として UIPrintPageRenderer に割り当てています。
これは部分的に機能します。両方の属性文字列がページに印刷されます。
ただし、両方ともページの左端に重ねて印刷されます。
UIEdgeInsets を使用して印刷を制限しようとすると、値をハードコードしない限り失敗します。これは0
、printableRect.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)
}
}