2015-09-04 15 views
5

Ich versuche den Druck über eine iPad-App einzurichten, wo durch Klicken auf Drucken eine Ansicht mit all ihren Inhalten gedruckt wird. Hier ist, was ich habe versucht, (zusammengezogen aus ein paar Beispiele online):AirPrint Inhalt einer UIView

// This is the View I want to print 
// Just a 200x200 blue square 
var testView = UIView(frame: CGRectMake(0, 0, 200, 200)) 
testView.backgroundColor = UIColor.blueColor() 

let printInfo = UIPrintInfo(dictionary:nil)! 
printInfo.outputType = UIPrintInfoOutputType.General 
printInfo.jobName = "My Print Job" 

// Set up print controller 
let printController = UIPrintInteractionController.sharedPrintController() 
printController!.printInfo = printInfo 
// This is where I was thinking the print job got the 
// contents to print to the page?? 
printController?.printFormatter = testView.viewPrintFormatter() 

// Do it 
printController!.presentFromRect(self.frame, inView: self, animated: true, completionHandler: nil) 

Aber ich habe auch gelesen, dass hereviewPrintFormatter nur verfügbar ist, zu UIWebView, UITextView und MKMapView, ist das richtig?

Wenn ich damit drucke (mit dem Druckersimulator) bekomme ich nur eine leere Seite; versucht mit verschiedenen Druckern/Papiergrößen.

Jede Anleitung wird sehr geschätzt!

+0

Was passiert, wenn Sie es versuchen? – Undo

+0

Mein Bad - aktualisierte Frage –

Antwort

9

Ich bin mir nicht sicher, ob dies der richtige Weg ist, aber ich löste dies, indem ich die Ansicht in eine umwandelte und sie dann als printingItem des Druckcontrollers einstellte.

Aktualisiert Code:

// This is the View I want to print 
// Just a 200x200 blue square 
var testView = UIView(frame: CGRectMake(0, 0, 200, 200)) 
testView.backgroundColor = UIColor.blueColor() 

let printInfo = UIPrintInfo(dictionary:nil)! 
printInfo.outputType = UIPrintInfoOutputType.General 
printInfo.jobName = "My Print Job" 

// Set up print controller 
let printController = UIPrintInteractionController.sharedPrintController() 
printController!.printInfo = printInfo 

// Assign a UIImage version of my UIView as a printing iten 
printController?.printingItem = testView!.toImage() 

// Do it 
printController!.presentFromRect(self.frame, inView: self, animated: true, completionHandler: nil) 

Die toImage() Methode ist eine Erweiterung UIView:

extension UIView { 
    func toImage() -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale) 

     drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true) 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

Offen für alternative Ansätze, wenn jemand ein Produkt!

+0

Ziemlich großartig, danke! – LinusGeffarth

+2

Eine sehr gute Lösung, funktionierte perfekt für mich. Danke vielmals.. –

1

Vielleicht muss jemand (wie ich) der Bildansicht einen Rahmen hinzufügen, bevor er an den Drucker gesendet wird (sonst passt das Bild automatisch zum Blatt). Ich habe nach einigen Einbaumethoden gesucht, um das zu tun, aber ich habe es nicht gefunden (übrigens lese ich einige Hinweise aus here). Der Trick besteht darin, die Ansicht, die das Bild enthält, zu einer externen Ansicht hinzuzufügen und dann zu zentrieren.

let borderWidth: CGFloat = 100.0 
    let myImage = UIImage(named: "myImage.jpg") 
    let internalPrintView = UIImageView(frame: CGRectMake(0, 0, myImage.size.width, myImage.size.height)) 
    let printView = UIView(frame: CGRectMake(0, 0, myImage.size.width + borderWidth*2, myImage.size.height + borderWidth*2)) 
    internalPrintView.image = myImage 
    internalPrintView.center = CGPointMake(printView.frame.size.width/2, printView.frame.size.height/2) 
    printView.addSubview(internalPrintView) 
    printController.printingItem = printView.toImage() 

Es ist ein bisschen komplex, aber es macht seine schmutzige Arbeit.

Verwandte Themen