Содержимое AirPrint UIView

Я пытаюсь настроить печать через приложение для iPad, где нажатие кнопки «Печать» распечатает представление со всем его содержимым. Вот что я пробовал (собрано из нескольких примеров в Интернете):

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

Однако я также прочитал здесь этот viewPrintFormatter доступен только для UIWebView, UITextView и MKMapView, это правильно?

Когда я печатаю этим (используя симулятор принтера), я просто получаю пустую страницу; пробовал с разными принтерами/размерами бумаги.

Любое руководство очень ценится!


person Jody Heavener    schedule 04.09.2015    source источник
comment
Что происходит, когда вы пытаетесь это сделать?   -  person Undo    schedule 04.09.2015
comment
Мой плохой - обновленный вопрос   -  person Jody Heavener    schedule 04.09.2015


Ответы (2)


Я не уверен, что это правильный способ сделать это, но в итоге я решил это, преобразовав представление в UIImage, а затем установив его как printingItem контроллера печати.

Обновленный код:

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

Метод toImage() является расширением UIView:

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

        drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)

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

Открыты для альтернативных подходов, если у кого-то есть!

person Jody Heavener    schedule 08.09.2015

Возможно, кому-то (например, мне) нужно добавить границу к изображению перед отправкой на принтер (иначе изображение автоматически помещается на листе). Я искал некоторые встроенные методы, чтобы сделать это, но не нашел (кстати, я прочитал некоторые подсказки от здесь). Хитрость заключается в том, чтобы добавить представление, содержащее изображение, к внешнему виду, а затем отцентрировать его.

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

Это немного сложно, но делает свою грязную работу.

person RikiRiocma    schedule 26.03.2016