大雑把に次の2つの手順となる。
1.UIPrintInteractionControllerを起動する。
2.UIPrintPageRenderer のサブクラスで印刷処理をする。
【1.について】
イベント発生時(通常はメニュー選択)に呼び出される関数を作成する。
- (IBAction)printPage:(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 の作成
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = [NSString stringWithFormat: @"job title"];
printInfo.duplex = UIPrintInfoDuplexLongEdge;// 両面印刷
printInfo.orientation = m2pView.frame.size.width < m2pView.frame.size.height ?
UIPrintInfoOrientationPortrait : UIPrintInfoOrientationLandscape;// 用紙方向を画面の方向と同じする
controller.printInfo = printInfo;
controller.showsPageRange = YES;// 複数ページ
// UIPrintPageRendererのサブクラスを作成
MyPrintPageRenderer *myRenderer = [[MyPrintPageRenderer alloc] init];
myRenderer.jobTitle = printInfo.jobName;
myRenderer.m2pView = m2pView;//描画用のコントロールを渡しておく
controller.delegate = myRenderer;//印刷時のdelegate関数はMyPrintPageRendererに記述
// ビューフォーマッターとやらの定義も必要らしい
UIViewPrintFormatter *viewFormatter;
viewFormatter = [self.m2pView viewPrintFormatter];
[myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0];
controller.printPageRenderer = myRenderer;
[myRenderer release];
// 印刷ダイアログ表示(印刷ボタンを押せばMyPrintPageRendererのdelegate関数が呼ばれる)
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
[controller presentFromBarButtonItem:bbiPrint animated:YES completionHandler:completionHandler]; // iPad
else
[controller presentAnimated:YES completionHandler:completionHandler]; // iPhone
}
【2.について】
Appleが提供するサンプルコードのMyPrintPageRenderer.mがほぼ流用できる。
印刷領域は、ヘッダー・コンテンツ・フッターの上中下3分割となっている。
以下をページ単位に描画すればOK.
- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect;
- (void)drawContentForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)contentRect;
- (void)drawFooterForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)footerRect;
0 件のコメント:
コメントを投稿