1

J'ai une chaîne HTML à imprimer avec AirPrint dans mon application iOS. Cependant, la chaîne est personnalisable et l'utilisateur est autorisé à définir la marge/paddings, la taille de police/police, l'orientation etc.Définition des pages à imprimer pour UIPrintPageRenderer/UIPrintInteractionController

Ainsi, parfois la sortie peut être plus de 2 pages où la deuxième page est vide. Là, je veux définir une plage pour les pages à imprimer. En fait, je veux juste imprimer seulement la première page, peu importe ce que la sortie est.

Voici la boîte de dialogue du contrôleur d'interaction d'impression, vous pouvez voir qu'il n'y a pas plage définie et la sortie est plus d'une page:

UIPrintInteractionController Dialog

Et voici mon code:

// create an html output text 
let markupText = "<div style='width: 100%; text-align: center;'><div style='display: inline-block; margin-top: 35mm; margin-left: 45mm;'>Hello, printer.</div></div>" 

// initialize print formatter 
let formatter = UIMarkupTextPrintFormatter(markupText: markupText) 
formatter.contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) 
formatter.startPage = 0 

// initialize print renderer and set its formatter 
let printRenderer = UIPrintPageRenderer() 
printRenderer.addPrintFormatter(formatter, startingAtPageAtIndex: 0) 
printRenderer.prepareForDrawingPages(NSMakeRange(0, 1)) 

// initialize print controller to present print dialog 
let printController = UIPrintInteractionController.sharedPrintController() 
printController.printPageRenderer = printRenderer 
printController.presentAnimated(true, completionHandler: nil) 

J'étais incapable de trouver assez d'informations sur la définition de la gamme, bien que je pensais que la méthode ferait l'affaire. Des idées sur l'accomplissement de cela?

Répondre

1

Si vous souhaitez utiliser une sous-classe personnalisée de UIPrintPageRenderer, il existe également une méthode numberOfPages que vous pouvez remplacer pour calculer le nombre de pages. Cependant, je crois que vous pourriez juste oublier de mettre la propriété UIPrintInteractionController à YES. J'ai résolu cela en écrivant mon code HTML dans un fichier PDF (NSData), et en affectant la propriété printingItem à cet élément. Mon code est en Objective-C, mais le même principe s'applique.

printingItem documentation

Generating PDF content

+0

NumberOfPages propriété est en lecture seule: "ne peut affecter à la valeur: appel renvoie la fonction valeur immuable". Définit showPagesRange sur true, mais rien n'a changé, même résultat. – kubilay

+0

PDF chose était une bonne idée. La méthode drawPageAtIndex de UIPrintPageRenderer a réussi à créer un fichier PDF d'une seule page afin que tout se passe bien après l'obtention de ce PDF en une page. Créé le fichier avec un peu d'aide de https://gist.github.com/nyg/b8cd742250826cb1471f – kubilay

+0

@kubilay 'numberOfPages' est aussi une méthode qui calcule le nombre de pages, mais vous devez créer une sous-classe personnalisée de' UIPrintPageRenderer' pour le contourner. J'utilisais une sous-classe personnalisée jusqu'à ce que je comprenne que la chose PDF était tellement plus facile. Je vais modifier pour reconnaître que cela ne fonctionne que dans les sous-classes personnalisées. – cbay