これは古い質問ですが、私は数日かけて答えを探し、Appleのドキュメントとサンプルコードで誤解を招くようなコメントをいくつかフォローしました。だから、私はこれをここに貼り付けて、私が無駄にした日を次の人を救うためにしています。
具体的な問題は次のとおりです。UIPrintInteractionControllerに指定された単一の印刷ジョブで複数を印刷できるをどのように作成しますか?UIPrintPageRenderer
UIWebViews
このAppleサンプルコードPrintWebViewを使用して、最初にすべてをPDFに変換する必要のないソリューションにかなりの距離を置くことができます。また、このドキュメントはいくつかの助けになります:UIPrintPageRenderer。問題は、サンプルアプリとのドキュメントが、このプロパティを介してUPPrintPageRenderer
複数を追加する場合に次のことを示唆していることです。UIPrintFormatter
@property(nonatomic,copy) NSArray <UIPrintFormatter *> *printFormatters
PrintWebViewでオーバーライド-(NSInteger)numberOfPages
するメソッドに対してAppleが提供したサンプルコードは、正しく機能し、正しいページ数を把握します。
あなたがしなければならないことは、printFormatters
以下に示す方法を介して非自明な方法でを追加し、次にそれぞれのstartPageプロパティを修正し、これらをまとめて使用して、UIPrintPageRendererが返す正しいpageCountを計算します。代わりに、これを使用してください:
-(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex
なぜこれが機能し、他は機能しないのですか?わからない、おそらくバグ....レーダーを提出する必要があります:)しかし、@ Mustafaとこの他のStackoverflowのヒントに感謝します:
1つの印刷ジョブで複数のUIWebViewを印刷するための手順は次のとおりです。
- 上記で参照したPrintWebViewの例のAppleの概要に従い、指定したwebView.viewPrintFormatters
UIPrintPageRenderer
に必要なプロパティを設定するように記述します。
- 次の方法でprintFormattersを追加します。
[addPrintFormatter:startingAtPageAtIndex:]
- メソッドで、
UIPrintPageRenderer
-(NSInteger)numberOfPages
各フォーマッターからpageCountを取得し、それを使用してstartPageと合計ページ数の値を更新します。
従うべき基本的なコードの概要は次のとおりです(参考:このソリューションは、iOS 9.0のデプロイターゲットで構築されたアプリで機能します):
UIPrintPageRendererクラスをそのように定義します(実際にはinit
メソッドは必要ありませんが、私のユースケースでは、そこに値を設定します):
@interface MyPrintPageRenderer : UIPrintPageRenderer
@end
@implementation MyPrintPageRenderer
-(id)init
{
self = [super init];
if(self) {
self.headerHeight = 0;
self.footerHeight = 0;
}
return self;
}
//
// Set whatever header, footer and insets you want. It is
// important to set these values to something, so that the print
// formatters can figure out their own pageCounts for whatever
// they contain. Look at the Apple sample App for PrintWebView for
// for more details about these values.
//
-(NSInteger)numberOfPages
{
__block NSUInteger startPage = 0;
for(UIPrintFormatter *pf in self.printFormatters) {
pf.contentInsets = UIEdgeInsetsZero;
pf.maximumContentWidth = self.printableRect.size.width;
pf.maximumContentHeight = self.printableRect.size.height;
dispatch_async(dispatch_get_main_queue(), ^{
pf.startPage = startPage;
startPage = pf.startPage + pf.pageCount;
});
}
return [super numberOfPages];
}
@end
印刷するUIWebViewの印刷アクションを処理するコントローラーで、次のようにします。
-(void)printWebViews
{
MyPrintPageRenderer *pr = [MyPrintPageRenderer new];
//
// Add the printFormatters at sequential startingPageIndexes,
// your renderer will set them to the correct values later based
// on the various page metrics and their content.
//
[pr addPrintFormatter:_webView1.viewPrintFormatter startingAtPageAtIndex:0];
[pr addPrintFormatter:_webView2.viewPrintFormatter startingAtPageAtIndex:1];
[pr addPrintFormatter:_webView3.viewPrintFormatter startingAtPageAtIndex:2];
// Set whatever values needed for these as per Apple docs
UIPrintInfo *pi = [UIPrintInfo printInfo];
pi.outputType = UIPrintInfoOutputGeneral;
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
pic.printInfo = pi;
pic.printPageRenderer = pr;
[pic presentAnimated:NO completionHandler:nil];
}
そして出来上がり!今...それはうまくいきます;)