[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 の複合機が一台あるので、それが表示されています。
AirPrint が利用できないと、次のように何も表示されません。
まとめ
UIPrinterPickerController によって、プリンターを選択する実装がかなり自由になりましたね。