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