2015-09-04 12 views
5

Próbuję skonfigurować drukowanie za pośrednictwem aplikacji na iPada, gdzie kliknięcie przycisku Drukuj spowoduje wydrukowanie widoku z całą zawartością. Oto, co starałem (ciągną razem z kilkoma przykładami online):Zawartość AirPrint w 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) 

Jednakże, czytałem też here że viewPrintFormatter jest dostępna tylko dla UIWebView, UITextView i MKMapView, czy to prawda?

Kiedy drukuję za pomocą tego (za pomocą symulatora drukarki), otrzymuję pustą stronę; Próbowano z różnymi drukarkami/rozmiarami papieru.

Wszelkie wskazówki są mile widziane!

+0

Co stanie się, gdy spróbujesz? – Undo

+0

Moje złe - zaktualizowane pytanie –

Odpowiedz

9

Nie jestem pewien, czy jest to właściwy sposób, ale ostatecznie rozwiązałem ten problem, przekształcając widok na UIImage, a następnie ustawiając go jako kontroler druku printingItem.

Zaktualizowany kod:

// 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) 

Sposób toImage() jest rozszerzeniem UIView:

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

     drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true) 

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

Otwarty na alternatywnych podejść jeśli ktoś ma jeden!

+0

Całkiem świetnie, dzięki! – LinusGeffarth

+2

Bardzo dobre rozwiązanie, działa idealnie dla mnie. Wielkie dzięki.. –

1

Może ktoś (jak ja) musi dodać obramowanie do widoku obrazu, zanim wyśle ​​go do drukarki (w przeciwnym razie obraz zostanie automatycznie dopasowany do arkusza). Szukałem w tym celu pewnych wbudowanych metod, ale tego nie znalazłem (przy okazji przeczytałem kilka wskazówek z here). Sztuką jest dodanie widoku zawierającego obraz do widoku zewnętrznego, a następnie wyśrodkowanie go.

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() 

Jest to trochę skomplikowane, ale wykonuje swoją brudną robotę.