【发布时间】:2016-12-06 08:03:13
【问题描述】:
我的最终目标是创建多个UIMarkupTextPrintFormatter 并将它们全部打印在一个打印作业中。
例如,第一个格式化程序包含填充第一页和第二页一点点的文本。虽然仍有空间打印第二个格式化程序,但我希望第二个格式化程序打印在第三页上。所以基本上,在打印另一个格式化程序之前,开始一个新页面。
我不知道一个格式化程序在编译时会填满多少页,因为它取决于用户输入。可能有 1 个、2 个或更多。
我听说我需要使用UIPrintPageRenderer,所以我阅读了它的文档并尝试了这个:
// I'm using webviews here because I don't want to write 2 pages worth of markup...
// it should be the same anyway. The two webviews display different wikipedia articles
// Also, don't judge my variable names. I'm lazy and this is just test code...
let formatter = webView.viewPrintFormatter()
let formatter1 = webView2.viewPrintFormatter()
formatter.contentInsets = UIEdgeInsets(top: 72, left: 72, bottom: 72, right: 72)
formatter1.contentInsets = UIEdgeInsets(top: 72, left: 72, bottom: 72, right: 72)
let renderer = UIPrintPageRenderer()
renderer.addPrintFormatter(formatter, startingAtPageAt: 0)
renderer.addPrintFormatter(formatter1, startingAtPageAt: formatter.pageCount)
printController.printPageRenderer = renderer
printController.present(animated: true, completionHandler: nil)
为了添加第二个打印格式化程序,我使用formatter.pageCount 作为第二个参数。我希望它会在第一页的最后一页之后添加第二个格式化程序。但它没有。它只打印了第二个格式化程序中的内容。
我打印了formatter.pageCount,发现它的值为0。
我完全糊涂了。如何获取格式化程序将填满多少页?
我也尝试实现自己的渲染器:
class MyRenderer: UIPrintPageRenderer {
override func drawPrintFormatter(_ printFormatter: UIPrintFormatter, forPageAt pageIndex: Int) {
printFormatter.draw(in: self.printableRect, forPageAt: pageIndex)
}
}
但是当打印交互控制器显示时它就崩溃了:
试图从主线程或web线程以外的线程获取web lock。这可能是从辅助线程调用 UIKit 的结果。现在崩溃了...
我的代码做错了什么?
【问题讨论】:
-
您正在从不是主线程的线程调用 UI 内容。您必须仅从主线程调用 UI 内容。显示您调用此代码的位置。可能来自下载任务的完成处理程序或 webview 的委托。
-
@shallowThought 我在
@IBAction方法中执行此操作,该方法应该在 UI 线程上。 -
没有看到真正的代码,很难甚至不可能提供帮助。
-
@shallowThought 所以你不能用给定的代码重现问题?我的代码可以在你的机器上运行吗?
-
恐怕没有更真实的代码,这(复制)是不可能的。