Moim ostatecznym celem jest utworzenie wielu UIMarkupTextPrintFormatter
i wydrukowanie ich wszystkich w jednym zadaniu drukowania.Jak AirPrint wielu formaterów drukowania za jednym razem?
Na przykład pierwszy formater zawiera tekst, który wypełnia pierwszą stronę i odrobinę drugiej strony. Mimo że pozostało wolne miejsce do wydrukowania drugiego formatyzatora, chcę, aby drugi format był drukowany na trzeciej stronie. Zasadniczo przed wydrukowaniem innego formatera rozpocznij nową stronę.
Nie mogę wiedzieć, ile stron jeden formatator zapełni się podczas kompilacji, ponieważ zależy od danych wprowadzonych przez użytkownika. Może 1, 2 lub więcej.
usłyszałem, że muszę korzystać UIPrintPageRenderer
tak czytam swoje dokumenty i próbował to:
// 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)
Aby dodać drugą formatowania wydruku, użyłem formatter.pageCount
jako drugi argument. Miałem nadzieję, że doda drugi formater po ostatniej stronie pierwszego. Ale tak się nie stało. Drukuje tylko rzeczy w drugim formatyzatorze.
wydrukowałem formatter.pageCount
i znaleźć jego wartość wynosi 0.
Jestem całkowicie zdezorientowany. Jak mogę sprawdzić, ile stron wypełni formatator?
Próbowałem też wdrożyć własne renderujący:
class MyRenderer: UIPrintPageRenderer {
override func drawPrintFormatter(_ printFormatter: UIPrintFormatter, forPageAt pageIndex: Int) {
printFormatter.draw(in: self.printableRect, forPageAt: pageIndex)
}
}
Ale wtedy po prostu wywala gdy kontroler interakcja print pokazał:
próbowali uzyskać blokadę internetową z wątku innego niż główny wątek lub wątek internetowy. Może to być wynikiem wywołania UIKit z wątku dodatkowego. Rozbijanie teraz ...
Co zrobiłem źle w moim kodzie?
Wywołujesz elementy interfejsu użytkownika z wątku, który nie jest głównym wątkiem. Powinieneś tylko wywoływać elementy interfejsu użytkownika tylko z głównego wątku. Pokaż, gdzie nazywasz ten kod. Prawdopodobnie z poziomu obsługi zakończenia zadania pobierania lub delegata widoku WWW. – shallowThought
@shallowThought robię to w metodzie '@ IBAction', który powinien być w wątku UI. – Sweeper
Nie widząc prawdziwego kodu, trudno jest mu pomóc. – shallowThought