我正在使用 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)
}
}