1

WebViewを使用してURLのリストを表示するiPadアプリケーションがあります。PrintInteractionControllerでユーザーに何度もプロンプトを表示することなく、すべてのWebViewを一度に印刷できるようにしたいと思います。問題は、PrintInteractionControllerにこれを実行する機能がないように見えることです。複数のviewFormatterを割り当てることはできず、WebViewはprintItemとして認識されません。アイテムを印刷するだけで、PrintInteractionControllerを表示しない方法もありません。

誰かがこれを行う方法を知っていますか?

乾杯。

4

2 に答える 2

2

これは古い質問ですが、私は数日かけて答えを探し、Appleのドキュメントとサンプルコードで誤解を招くようなコメントをいくつかフォローしました。だから、私はこれをここに貼り付けて、私が無駄にした日を次の人を救うためにしています。

具体的な問題は次のとおりです。UIPrintInteractionControllerに指定された単一の印刷ジョブで複数を印刷できるをどのように作成しますか?UIPrintPageRendererUIWebViews

この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を印刷するための手順は次のとおりです。

  1. 上記で参照したPrintWebViewの例のAppleの概要に従い、指定したwebView.viewPrintFormattersUIPrintPageRendererに必要なプロパティを設定するように記述します。
  2. 次の方法でprintFormattersを追加します。[addPrintFormatter:startingAtPageAtIndex:]
  3. メソッドで、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];
}

そして出来上がり!今...それはうまくいきます;)

于 2016-03-03T10:23:38.843 に答える
1

printPageRendererUIPrintIterationControllerオブジェクトのプロパティを使用します。UIPrintPageRendererサブクラスオブジェクトに複数のUIPrintFormatterサブクラスを設定できます。

于 2011-02-21T00:19:02.807 に答える