[iOS 8] UIPrinterPickerController でプリンターを選択して印刷する

UIPrinterPickerController

UIPrinterPickerController は iOS 8 から追加された、プリンターを検索し選択するための View Controller を提供するクラスです。以前まで印刷を行う方法は UIPrintInteractionController を使って実装することができましたが、View Controller がすべて提供された形でしたので View のカスタマイズが難しかったです。このクラスを通してプリンターを選択することで、その後の印刷処理が View を介さなくても実装できるようになりました。

UIPrinterPickerController を使う

UIPrinterPickerController は次のように表示します。

func showPrinterPicker() {
    // UIPrinterPickerControllerのインスタンス化
    let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: nil)
    // UIPrinterPickerControllerをモーダル表示する
    printerPicker.presentAnimated(true, completionHandler: {
        [unowned self] printerPickerController, userDidSelect, error in
        if (error != nil) {
            // エラー
            println("Error : \(error)")
        } else {
            // 選択したUIPrinterを取得する
            if let printer: UIPrinter = printerPickerController.selectedPrinter {
                println("Printer : \(printer.displayName!)")
                self.printToPrinter(printer)
            } else {
                println("Printer is not selected")
            }
        }
    })
}

func printToPrinter(printer: UIPrinter) {
    // 印刷してみる
    if let printIntaractionController = UIPrintInteractionController.sharedPrintController() {
        let info = UIPrintInfo(dictionary: nil)
        info.jobName = "Sample Print"
        info.orientation = .Portrait
        printIntaractionController.printInfo = info
        printIntaractionController.printingItem = UIImage(named: "sample.jpg")
        printIntaractionController.printToPrinter(printer, completionHandler: {
            controller, completed, error in
            
        })
    }
}

解説します。まずはじめに UIPrinterPickerController をインスタンス化していますが、引数に UIPrinter を渡すことができます。これは表示されるプリンター一覧に、前回選択したプリンターにチェックを付けたいときに使います。特に必要ない場合は nil を渡せば良いです。

次に presentAnimated:completionHandler: を呼び出し、UIPrinterPickerController を表示しています。第一引数はアニメーションするか否か、第二引数はコールバック関数として (UIPrinterPickerController!, Bool, NSError!) -> Void 型の関数を渡します。この第一引数の UIPrinterPickerController の selectedPrinter から選択した UIPrinter が取得できます(Optional にラップされているので、アンラップする必要があります)。あとはこのオブジェクトを UIPrintInteractionController の printToPrinter:completionHandler: に渡せば、指定したプリンターで印刷できます。

また、UIPrinterPickerController を表示するメソッドは次のように、3種類用意されています。

メソッド 説明
presentAnimated(_:completionHandler:) モーダルで表示
presentFromBarButtonItem(_:animated:completionHandler:) UIBarButtonItem からポップオーバーで表示
presentFromRect(_:inView:animated:completionHandler:) ポップオーバーで表示

なお上記コードでは記述していませんが、dismissAnimated: で好きなタイミングで閉じることができます。

実行する

それでは実行してみましょう。上記の関数を呼び出すと、次のように利用可能なプリンターのリストが表示されます。弊社には EPSON の複合機が一台あるので、それが表示されています。

ui_printer_picker_controller01

AirPrint が利用できないと、次のように何も表示されません。

ui_printer_picker_controller02

まとめ

UIPrinterPickerController によって、プリンターを選択する実装がかなり自由になりましたね。

参考