UIPrintFormatter
は、図 5-8に示したすべてのプロパティを使用して、印刷ジョブに必要なページ 数を計算します。この値は、読み取り専用のpageCount
プロパティに格納されます。印刷フォーマッタの使用
UIKitを利用すると、単一の印刷フォーマッタを印刷ジョブに割り当てることができます。これは、プ
レーンテキストやHTMLドキュメントを持つ場合に役立つ機能です。UIKitには、この種のテキストコ ンテンツ用の印刷フォーマッタ具象クラスがあるからです。また、このフレームワークは、特定のUIKitビューのコンテンツをプリンタに合った方法で印刷できるようにする印刷フォーマッタ具象サブ
クラスも実装しています。UIPrintFormatter
クラスは、システム組み込みの印刷フォーマッタを表す抽象基底クラスです。現状、iOSには次の印刷フォーマッタが組み込まれています。
●
UIViewPrintFormatter — 複数ページにわたってビューの内容を自動的にレイアウトします。
印刷フォーマッタやページレンダラの利用
ビューの印刷に用いる印刷フォーマッタを取得するには、当該ビューの
viewPrintFormatter
メ ソッドを使います。UIKitの組み込みクラスの中には、印刷処理に対応していないものもあります。現在のところ、印
刷用にコンテンツを描画する方法を認識しているのは、UIWebView
、UITextView
、MKMapView
の 各ビュークラスだけです。ビューフォーマッタは、カスタムビューの印刷には使えません。カスタムビューの内容を印刷し たい場合は、代わりに
UIPrintPageRenderer
を使ってください。●
UISimpleTextPrintFormatter — プレインテキストドキュメントを自動的に描画、レイアウト
します。テキストのグローバルプロパティ(フォント、色、配置、改行モードなど)も設定でき ます。●
UIMarkupTextPrintFormatter — HTMLドキュメントを自動的に描画、レイアウトします。
注意:
UIPrintFormatter
クラスはサブクラス化を想定していません。独自にレイアウトを 施す必要があれば、代わりにページレンダラを記述してください。以降の説明は単一のフォーマッタ(ページレンダラなし)の使い方に関係していますが、印刷フォー マッタについてのほとんどの情報は、ページレンダラと組み合わせて使われる印刷フォーマッタにも 当てはまります。これについては、“1つ以上のフォーマッタをページレンダラと一緒に使用す る” (73 ページ)で説明します。
テキストドキュメントや HTML ドキュメントの印刷
多くのアプリケーションには、ユーザが印刷したいと考えるテキストコンテンツが含まれています。
コンテンツがプレーンテキストやHTMLテキストで、表示されているテキストコンテンツの元になっ ている文字列にアクセスできる場合は、
UISimpleTextPrintFormatter
またはUIMarkupTextPrintFormatter
のインスタンスを使用して、印刷用にテキストをレイアウトして描画 できます。単にインスタンスを作成して、元になっている文字列で初期化し、レイアウトプロパティ を指定します。次に、作成したこのインスタンスを、共有のUIPrintInteractionController
イン スタンスのインスタンス変数printFormatter
に割り当てます。リスト 5-2 に、
UIMarkupTextPrintFormatter
オブジェクトを使用してHTMLドキュメントを印刷す る方法を示します。(プリンタが定義する)印刷可能領域の内側に、さらに余白を追加します。印刷 可能領域は、UIPrintInteractionController
オブジェクトのprintPaper
プロパティで調べること ができます。指定した幅の余白を追加する、より完全なコード例は、『UIKit Printing withUIPrintInteractionController and UIViewPrintFormatter
』サンプルコードプロジェクトを参照してくださ い。印刷フォーマッタやページレンダラの利用
リスト 5-2 HTMLドキュメント(ヘッダ情報なし)の印刷
- (IBAction)printContent:(id)sender {
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
pic.delegate = self;
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = self.documentName;
pic.printInfo = printInfo;
UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc]
initWithMarkupText:self.htmlString];
htmlFormatter.startPage = 0;
htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1イ ンチの余白
pic.printFormatter = htmlFormatter;
pic.showsPageRange = YES;
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError
*error) {
if (!completed && error) {
NSLog(@"Printing could not complete because of error: %@", error);
} };
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { [pic presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];
} else {
[pic presentAnimated:YES completionHandler:completionHandler];
} }
印刷フォーマッタやページレンダラの利用
印刷ジョブに単一の印刷フォーマッタを使用する場合は(つまり、
1
つのUIPrintFormatter
オブジェ クトをUIPrintInteractionController
インスタンスのprintFormatter
プロパティに割り当てる)、印刷される各ページにヘッダとフッタのコンテンツを描画することはできません。ヘッダとフッタを 描画するには、
UIPrintPageRenderer
オブジェクトに加えて、必要な印刷フォーマッタを使用する 必要があります。詳細については、“1つ以上のフォーマッタをページレンダラと一緒に使用す る” (73 ページ)を参照してください。UISimpleTextPrintFormatter
オブジェクトを使用してプレーンテキストドキュメントをレイアウト して印刷する手順も、ほとんど同じです。ただし、このオブジェクトのクラスには、フォント、色、印刷するテキストの配置を設定するプロパティが含まれています。
ビュー印刷フォーマッタの使用
UIViewPrintFormatter
クラスのインスタンスを使用して、いくつかのシステムビューのコンテンツ をレイアウトして印刷できます。UIKitフレームワークは、そのビューに対してこれらのビュー印刷 フォーマッタを作成します。多くの場合、表示用のビューの描画に使われるコードと同じものが、印 刷用のビューの描画にも使われます。現時点では、ビュー印刷フォーマッタを使用してコンテンツを 印刷できるシステムビューは、UIWebView
、UITextView
、およびMKMapView
(MapKitフレームワー ク)のインスタンスです。UIView
オブジェクトのビュー印刷フォーマッタを取得するには、ビューに対してviewPrintFormatter
を呼び出します。開始ページと任意のレイアウトプロパティを設定して、このオブジェクトを共有イ ンスタンスUIPrintInteractionController
のprintFormatter
プロパティに割り当てます。あるい は、印刷する出力の一部をUIPrintPageRenderer
オブジェクトを使用して描画している場合は、こ のオブジェクトにビュー印刷フォーマッタを追加することもできます。リスト 5-3に、UIWebView
オ ブジェクトのビュー印刷フォーマッタを使用して、そのビューのコンテンツを印刷するコードを示し ます。リスト 5-3 Web Viewのコンテンツの印刷
- (void)printWebPage:(id)sender {
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError
*error) {
if(!completed && error){
NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
} };
印刷フォーマッタやページレンダラの利用
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = [urlField text];
printInfo.duplex = UIPrintInfoDuplexLongEdge;
controller.printInfo = printInfo;
controller.showsPageRange = YES;
UIViewPrintFormatter *viewFormatter = [self.myWebView viewPrintFormatter];
viewFormatter.startPage = 0;
controller.printFormatter = viewFormatter;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { [controller presentFromBarButtonItem:printButton animated:YES completionHandler:completionHandler];
}else
[controller presentAnimated:YES completionHandler:completionHandler];
}
UIViewPrintFormatter
を使った完全なコード例は、『UIKit Printing with UIPrintInteractionControllerand UIViewPrintFormatter
』サンプルコードプロジェクトを参照してください。ページレンダラの使い方
ページレンダラは、印刷ジョブの一部または全部を描画する
UIPrintPageRenderer
のカスタムサブ クラスのインスタンスです。これを使用するには、印刷ジョブのためにUIPrintInteractionController
インスタンスを準備するときに、サブクラスを作成してプロジェ クトに追加し、これをインスタンス化する必要があります。次に、このページレンダラをUIPrintInteractionController
のインスタンスのprintPageRenderer
プロパティに割り当てます。1つのページレンダラに、1つまたは複数の印刷フォーマッタを関連付けることができます。その場
合、ページレンダラは、自身の描画と印刷フォーマッタの描画を混合します。ページレンダラは、印刷可能なコンテンツを自ら描画、レイアウトするほか、印刷フォーマッタを下 請けとして使い、指定したページ範囲の一部または全部のレンダリング処理を委ねることも可能で す。したがって、ごく簡単な整形だけで構わなければ、
UIPrintPageRenderer
そのもののインスタ ンスを使い、必要な数の印刷フォーマッタに接続すればよいことになります。しかし通常は、UIPrintPageRenderer
のカスタムサブクラスのインスタンスとしてページレンダラを実装すること が多いでしょう。印刷フォーマッタやページレンダラの利用
注意
:
ドキュメントタイトルを繰り返し印刷したり、ページ数をインクリメントするなど、ヘッダ情報やフッタ情報を印刷する場合は、
UIPrintPageRenderer
のカスタムサブクラス を使用する必要があります。基底クラスである
UIPrintPageRenderer
には、ページ数を表すプロパティと、ページのヘッダとフッ タの高さを表すプロパティが含まれています。また、このクラスでは、いくつかのメソッドが宣言さ れています。これらのメソッドをオーバーライドしてページの特定の部分(ヘッダ、フッタ、コンテ ンツ自体)を描画したり、ページレンダラと印刷フォーマッタによる描画を組み込むことができま す。ページレンダラ属性の設定
ページレンダラが、印刷する各ページのヘッダとフッタに描画する場合は、ヘッダやフッタの高さを 指定する必要があります。それには、浮動小数点値(ポイント数を表す)を、ページレンダラのサブ クラスが継承した
headerHeight
プロパティとfooterHeight
プロパティに割り当てます。これらのプ ロパティの高さの値が0の場合(デフォルト)、drawHeaderForPageAtIndex:inRect:
メソッドとdrawFooterForPageAtIndex:inRect:
メソッドは呼び出されません。ページレンダラがページのコンテンツ領域(ヘッダとフッタの間の領域)に描画する場合は、ページ レンダラのサブクラスで
numberOfPages
メソッドをオーバーライドして、ページレンダラが描画する ページ数を計算して返すようにします。ページレンダラに関連付けられている印刷フォーマッタが、ヘッダとフッタの間にあるコンテンツをすべて描画する場合は、印刷フォーマッタがページ数を計算 してくれます。この状況は、ページレンダラがヘッダやフッタ領域だけを描画し、その他のコンテン ツはすべて印刷フォーマッタが描画する場合に生じます。
ページレンダラに印刷フォーマッタが関連付けられていない場合は、印刷可能なコンテンツの各ペー ジのレイアウトはすべてデベロッパに任されます。 レイアウトの寸法を計算するときは、
UIPrintPageRenderer
のheaderHeight
、footerHeight
、paperRect
、およびprintableRect
の各 プロパティを考慮します(最後の2つのプロパティは読み取り専用です)。ページレンダラが印刷 フォーマッタを使用している場合は、レイアウトの寸法にcontentInsets
のmaximumContentHeight
、maximumContentWidth
、およびUIPrintFormatter
の各プロパティが含まれます。詳細については、“印刷ジョブのレイアウトプロパティの設定” (64 ページ)の図と説明を参照してください。
描画メソッドの実装
アプリケーションがページレンダラを使用して印刷可能なコンテンツを描画する場合、UIKitは、要求 されたコンテンツの各ページに対して次のメソッドを呼び出します。UIKitがページの順番でこれらの メソッドを呼び出す保証はありません。さらに、ユーザがページのサブセットの印刷を要求した(つ まり、ページ範囲を指定した)場合は、UIkitはサブセットに含まれないページに対してこれらのメ ソッドを呼び出しません。
印刷フォーマッタやページレンダラの利用