一次打印多个UIWebView的内容

时间:2011-02-20 23:27:33

标签: printing uiwebview uiprintinteractioncntrler uiprintpagerenderer uiprintformatter

我有一个使用WebViews显示URL列表的iPad应用程序。我希望能够一次打印所有WebView,而不会使用PrintInteractionController多次提示用户。问题是PrintInteractionController似乎没有能力这样做。您无法分配多个viewFormatters,并且WebView不会被识别为printItems。我也找不到只打印项目而不显示PrintInteractionController的方法。

有谁知道这样做的方法?

干杯。

2 个答案:

答案 0 :(得分:1)

使用UIPrintIterationController对象的printPageRenderer属性。您可以在UIPrintPageRenderer子类对象中设置多个UIPrintFormatter子类。

答案 1 :(得分:0)

这是一个老问题,但我花了几天时间在Apple文档和示例代码中搜索答案并发表一些误导性评论。所以,我在这里坚持这一点,以便在我浪费的那些日子里拯救下一个人。

具体问题是: 如何在一个给UIPrintInteractionController的打印作业中编写可以打印多个UIPrintPageRenderer的{​​{1}}?

使用此Apple示例代码PrintWebView,您可以使用不涉及将所有内容转换为PDF的解决方案。此文档也将帮助一些人:UIPrintPageRenderer。问题是示例应用和UIWebViews的文档建议如果您通过此属性添加多个UPPrintPageRenderer

UIPrintFormatter

Apple为PrintWebView中覆盖@property(nonatomic,copy) NSArray <UIPrintFormatter *> *printFormatters 的方法提供的示例代码将 正常工作 并找出正确的页数。 .. 没有!

您需要做的是通过下面显示的方法以非显而易见的方式添加-(NSInteger)numberOfPages,然后更正其各自的startPage属性并共同使用这些属性来计算UIPrintPageRenderer返回的正确pageCount。相反,使用这个:

printFormatters

为什么这样做而另一个没有?不知道,可能是一个错误....我应该提交 雷达 :)但是感谢 @Mustafa 和其他{{3} }:

以下是在一个打印作业中打印多个UIWebView的步骤:

  1. 按照上面引用的 PrintWebView 示例中的Apple大纲,编写-(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex 以在 webView上设置所需的属性你给它的.viewPrintFormatters
  2. 通过以下方式添加printFormatters:UIPrintPageRenderer
  3. 在您的[addPrintFormatter:startingAtPageAtIndex:] UIPrintPageRenderer方法中,从每个格式化程序中获取pageCount,并使用它来更新startPage和总页数值。
  4. 以下是基本代码大纲(仅供参考:此解决方案适用于部署目标为 iOS 9.0 的应用程序):

    像这样定义你的UIPrintPageRenderer类(你真的不需要-(NSInteger)numberOfPages方法,但在我的用例中我在那里设置值我总是想要那样):

    init

    在处理要打印的UIWebViews的打印操作的 Controller 中,执行以下操作:

    @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
    

    瞧!现在...... 正常工作 ;)