在iOS 8.1.1中,drawPageAtIndex出现了卡顿问题。

3
我正在尝试使用[UIPrintPageRenderer drawPageAtIndex: inRect:]将四个webViews转换为PDF。但是,在iOS 8.1.1上,当它到达这一点时,它会挂起。没有错误消息,并且如果我尝试继续,代码仍然会在此处中断。有人遇到过这个问题并找到了解决方法吗?
当我在渲染器上设置paperRect和printableRect时,它会导致挂起。如果我省略这些行,则应用程序不会挂起,但生成的PDF为空白。
以下是更新后的代码:
int i = 0;
UIPrintPageRenderer *renderer = [[UIPrintPageRenderer alloc] init];
for(UIWebView *webView in webViews) {
    [renderer addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:i++];
}
CGRect paperRect = CGRectMake(0, 0, 612, 792);
CGRect printableRect = CGRectInset(paperRect, 20, 20);
[renderer setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
[renderer setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];

NSMutableData *pdfData = [NSMutableData data];
// Render the html into a PDF
UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
for (NSInteger i=0; i < [renderer numberOfPages]; i++)
{
    UIGraphicsBeginPDFPage();
    CGRect bounds = UIGraphicsGetPDFContextBounds();
    [renderer drawPageAtIndex:i inRect:bounds];  <-- Hangs here
}
UIGraphicsEndPDFContext();

哇,是的,它确实可以... 你想在主线程中的一个紧密循环内执行一个相当耗费资源的函数。试试使用 NSOperationQueue 替代。 - Lyndsey Scott
我已更新上面的代码。该代码在iOS 7.1中运行良好。但在iOS 8.1中,代码会卡住。如果我在渲染器上删除对set paperRect和printableRect的调用,则代码在iOS 8.1中不会卡住,但生成的PDF文件为空白。 - DCG
1个回答

5

我为任何也遇到这个问题的人发布此内容。这个卡住的情况是因为在Xcode中启用了异常断点,而出现了异常。显然,异常发生在[UIPrintPageRenderer drawPageAtIndex: inRect:]的实现过程中。您可以忽略此异常,代码将按预期继续执行。


哇,真是太好了,这差点就要让 PDF 渲染崩溃了 :-) - WrightsCS
在Xcode 14.3.1中,它是崩溃而不是卡住。这只发生在模拟器上。 - SNarula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接