Utilisation d'un ou plusieurs formateurs avec un moteur de rendu de page dans iOS

Est-ce que quelqu'un a essayé d'utiliser plusieurs formateurs ( UIViewPrintFormatter , UIMarkupTextPrintFormatter , UISimpleTextPrintFormatter ) avec un rendu de page ( UIPrintPageRenderer ) pour imprimer le contenu?

J'essaie d'utiliser deux UIMarkupTextPrintFormatters avec une sous-class UIPrintPageRenderer , mais je ne UIPrintPageRenderer pas à get l'printing. MyPrintPageRenderer class MyPrintPageRenderer de l' exemple de code PrintWebView .

J'ai parcouru la documentation d'Apple, mais ce n'est pas très utile, et il n'y a aucun exemple de code associé à la description. J'ai essayé quelques solutions mais jusqu'ici je n'ai pas eu de succès.

Aucune suggestion?

Le fait qu'il y ait très peu d'activité dans la section "Impression" suggère que peu de personnes l'utilisent, ou que les personnes utilisant cette API ne visitent pas cette communauté, ou que les gens ignorent simplement la question pour une raison quelconque.

De toute façon, j'ai été capable de résoudre mon problème. J'utilisais setPrintFormatters: méthode plus tôt qui n'était pas / ne fonctionne pas. Je ne sais pas pourquoi. J'ai donc commencé à expérimenter avec la addPrintFormatter:startingAtPageAtIndex: place. Et voici comment j'ai résolu mon problème:

 // To draw the content of each page, a UIMarkupTextPrintFormatter is used. NSSsortingng *htmlSsortingng = [self prepareWebViewHTML]; UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:htmlSsortingng]; NSSsortingng *listHtmlSsortingng = [self prepareWebViewListHTMLWithCSS]; UIMarkupTextPrintFormatter *listHtmlFormatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:listHtmlSsortingng]; // I think this should work, but it doesn't! The result is an empty page with just the header and footer text. // [myRenderer setPrintFormatters:[NSArray arrayWithObjects:htmlFormatter, listHtmlFormatter, nil]]; // Alternatively, i've used addPrintFormatters here, and they just work! // Note: See MyPrintPageRenderer's numberOfPages method implementation for relavent details. // The important point to note there is that the startPage property is updated/corrected. [myRenderer addPrintFormatter:htmlFormatter startingAtPageAtIndex:0]; [myRenderer addPrintFormatter:listHtmlFormatter startingAtPageAtIndex:1]; 

Dans MyPrintPageRenderer , j'ai utilisé le code suivant pour mettre à jour / corriger la propriété startPage afin qu'une nouvelle page soit utilisée pour chaque formateur:

 - (NSInteger)numberOfPages { // TODO: Perform header footer calculations // . . . NSUInteger startPage = 0; for (id f in self.printFormatters) { UIPrintFormatter *myFormatter = (UIPrintFormatter *)f; // Top inset is only used if we want a different inset for the first page and we don't. // The bottom inset is never used by a viewFormatter. myFormatter.contentInsets = UIEdgeInsetsMake(0, leftInset, 0, rightInset); // Just to be sure, never allow the content to go past our minimum margins for the content area. myFormatter.maximumContentWidth = self.paperRect.size.width - 2*MIN_MARGIN; myFormatter.maximumContentHeight = self.paperRect.size.height - 2*MIN_MARGIN; myFormatter.startPage = startPage; startPage = myFormatter.startPage + myFormatter.pageCount; } // Let the superclass calculate the total number of pages return [super numberOfPages]; } 

Je ne sais toujours pas s'il y a de toute façon APPEND le contenu imprimable de htmlFormatter et de listHtmlFormatter (en utilisant cette approche). Par exemple, plutôt que d'utiliser une nouvelle page pour listHtmlFormatter, continuez à imprimer depuis l'endroit où htmlFormatter s'est arrêté.

J'ajoute cette réponse d'information supplémentaire ici parce que j'ai passé 2 jours autour avec ça et la réponse de Mustafa m'a sauvé. Espérons que tout cela au même endroit épargnera aux autres beaucoup de time perdu.

J'essayais de comprendre pourquoi je ne pouvais pas get mon UIPrintPageRenderer personnalisé pour itérer sur un tableau de viewPrintFormatter partir de plusieurs UIWebViews que j'ai besoin d'imprimer dans un travail, et qu'il calcule correctement pageCount comme ces documents Apple le suggèrent: PrintWebView

La key était de les append via cette méthode:

 -(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex 

et PAS celui-ci:

 @property(nonatomic, copy) NSArray <UIPrintFormatter *> *printFormatters 

Les docs Apple suggèrent que UIPrintPageRenderer obtient le nombre de pages à partir des formateurs d'printing dans le tableau tant que les mésortingques correctes sont définies sur les formateurs d'printing, comme Mustafa montre ci-dessus. Mais cela ne fonctionne que si vous les ajoutez via addPrintFormatter:startingAtPageAtIndex:

Si vous les ajoutez en tant que tableau, printFormatters (indépendamment des mésortingques que vous leur définissez) returnnera un nombre de pages de 0!

Une note supplémentaire pour les personnes utilisant cette approche, mettez la mise à jour à viewPrintFormatter.startPage dans un bloc dispatch_async , sinon vous obtiendrez une exception:

 dispatch_async(dispatch_get_main_queue(), ^{ myFormatter.startPage = startPage; startPage = myFormatter.startPage + myFormatter.pageCount; }); 

Pour append à la réponse de @ Mustafa, startPage doit être déclaré comme suit :

 __block NSUInteger startPage 

s'il doit être utilisé dans le bloc dispatch_async