web-dev-qa-db-fra.com

Imprimer la vue sous iOS avec Swift

Je développe une application qui nécessite de générer et d’imprimer directement les laissez-passer visiteurs à partir d’un iPad via AirPrint.

J'ai cherché partout pour savoir comment imprimer une vue, mais je ne trouve que comment imprimer du texte, WebKit et mapKit.

Est-il possible d'imprimer une vue entière? Sinon, quelle serait la bonne solution pour imprimer un laissez-passer pour visiteur qui sera un texte brut, des cases et une photo. Merci.

13
Ben Sullivan

J'ai trouvé la réponse à ma question en modifiant le code trouvé ici: Contenu d'AirPrint d'un UIView

//create an extension to covert the view to an image
extension UIView {
 func toImage() -> UIImage {
    UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale)

    drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)

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

//In your view controller    
@IBAction func printButton(sender: AnyObject) {

    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 = self.view.toImage()

    // If you want to specify a printer
    guard let printerURL = URL(string: "Your printer URL here, e.g. ipps://HPDC4A3E0DE24A.local.:443/ipp/print") else { return }
    guard let currentPrinter = UIPrinter(url: printerURL) else { return }                     

    printController.print(to: currentPrinter, completionHandler: nil)

    // Do it
    printController.presentFromRect(self.view.frame, inView: self.view, animated: true, completionHandler: nil)
}
10
Ben Sullivan

Je pense que vous devez rechercher un exemple de code d'impression de photo avec Swift: https://developer.Apple.com/library/ios/samplecode/PrintPhoto/Introduction/Intro.html

Quelle est exactement votre vue, imageView ou UIView? Si vous êtes intéressé par imageView ou UIImage, l’échantillon Print Photo d’Apple est fait pour vous. Si votre sujet est UIView, vous pouvez créer un contexte pdf à partir de view.layers et l'envoyer à AirPrint tel que WebKit, texte ou vous pouvez imprimer pour créer des données pdf.

La meilleure solution est de créer un fichier PDF ici pour Swift Générer PDF avec Swift

Le fichier pdf à imprimer est destiné à la mise en œuvre de Swift:

var pdfLoc = NSURL(fileURLWithPath:yourPdfFilePath)
let printController = UIPrintInteractionController.sharedPrintController()!
let printInfo = UIPrintInfo(dictionary:nil)!

printInfo.outputType = UIPrintInfoOutputType.General
printInfo.jobName = "print Job"
printController.printInfo = printInfo
printController.printingItem = pdfLoc
printController.presentFromBarButtonItem(printButton, animated: true, completionHandler: nil)
3
furkan

Hier dans Swift 3.x 

 func prt() {

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

        // Set up print controller
        let printController = UIPrintInteractionController.shared
        printController.printInfo = printInfo

        // Assign a UIImage version of my UIView as a printing iten
        printController.printingItem = self.view.toImage()

        // Do it
        printController.present(from: self.view.frame, in: self.view, animated: true, completionHandler: nil)

    }

}

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

        drawHierarchy(in: self.bounds, afterScreenUpdates: true)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
}
1
Eduard Kempinger

Swift 4:

        let printInfo = UIPrintInfo(dictionary:nil)
        printInfo.outputType = UIPrintInfo.OutputType.general
        printInfo.jobName = "iOS app printing"

        let printController = UIPrintInteractionController.shared
        printController.printInfo = printInfo

        printController.printingItem = UIImage.imageFromView(self.view) // your view here

        printController.present(from: self.view.frame, in: self.view, animated: true, completionHandler: nil)
extension UIImage {

    /// Get image from given view
    ///
    /// - Parameter view: the view
    /// - Returns: UIImage
    public class func imageFromView(view: UIView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0)
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)

        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}
0
Alexander Volkov