Моя конечная цель - создать несколько UIMarkupTextPrintFormatter
и распечатать их все в одном задании на печать.Как AirPrint несколько форматов печати за один раз?
Например, первый форматтер содержит текст, который заполняет первую страницу и немного вторую страницу. Несмотря на то, что осталось еще оставить второй шрифт, я хочу, чтобы второй форматтер печатал на третьей странице. Поэтому, прежде чем печатать другой форматтер, запустите новую страницу.
Я не знаю, сколько страниц один форматир будет заполняться во время компиляции, потому что это зависит от ввода пользователем. Может быть, 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)
}
}
Но тогда он просто падает, когда контроллер взаимодействия печати показал:
Пытался получить веб-замок из потока, отличного от основной нити или сетевой нити. Это может быть результатом вызова UIKit из вторичного потока. Сбой сейчас ...
Что я сделал неправильно в своем коде?
Вы вызываете материал пользовательского интерфейса из потока, который не является основным потоком. Вы _must_ называете материал пользовательского интерфейса только из основного потока. Покажите, где вы вызываете этот код. Вероятно, из обработчика завершения задачи загрузки или делегата веб-представления. – shallowThought
@shallowThought Я делаю это в методе '@ IBAction', который должен быть в потоке пользовательского интерфейса. – Sweeper
Не видя реального кода, его трудно помочь. – shallowThought