iPad UIWebView PDF渲染给了我奇怪的视觉文物

时间:2010-04-18 00:12:05

标签: pdf uiwebview ipad

我在使用UIWebView在iPad上呈现PDF文件时遇到了一些困难。在肖像模式下一切正常,但将设备转换为风景会产生奇怪的视觉怪癖。放大(但不是放出)即使是最轻微的也会纠正它,但显然这不是一个理想的解决方法。

任何PDF文件都会出现问题(我已经尝试了几个,都是在本地存储在捆绑中,而不是从网上检索到的)。我还为iPhone创建了一个项目的克隆,它似乎运行得很好,所以问题是iPad特有的。问题出现在模拟器和物理iPad上。

截图

http://dev.boxkite.net/images/ipad/ipad-pdf.png

代码

 NSString* filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"pdf"];
 NSData* data = [NSData dataWithContentsOfFile:filePath];

 [self.webView 
  loadData:data
  MIMEType:@"application/pdf"
  textEncodingName:@"UTF-8"
  baseURL:nil];

非常感谢你的时间。

7 个答案:

答案 0 :(得分:3)

根据Apple的说法,这确实是一个已知的错误。

更好的解决方法是致电

-[UIView setNeedsDisplay]

在Web视图实例中的每个子视图上,如下所示:

for(UIView* subview in webView)
{
    for(UIView *reloadView in [subview subviews])
    {
        if([reloadView class] != [UIImageView class])
        {
            [reloadView setNeedsDisplay];
        }
    }
}

答案 1 :(得分:2)

解决此问题的唯一方法是,当您旋转/更改UIWebView的大小时,再次调用loadData:。这使它保持大约一秒钟(取决于文件大小),但现在不是一个可怕的修复。它肯定比调用loadRequest好多了:再次!

该错误已提交给苹果并已获批准。没有关于修复日期的消息。

答案 2 :(得分:2)

这是一个确认的错误。我找到了适用于我的解决方法。您可以在调整视图大小或自动旋转事件时使用此代码。


for (UIView *v in [webView subviews]) {
  for (UIView *v2 in [v subviews]) {
    if ([v2 class] != [UIImageView class]) [v2 setNeedsDisplay];
  }
}

就是这样。

答案 3 :(得分:1)

我相信这是众多模拟器中的一个。

答案 4 :(得分:1)

这也发生在我身上,真的很令人气愤。有人知道这个问题是否为Apple所知?似乎是他们的代码问题,而不是我们做错的任何事情。我找到修复它的唯一方法是告诉UIWebView在方向改变后重新加载pdf - 绝对不理想(特别是对于大型pdf) - 即使这样,在正确的版本出现之前,视觉印章仍会保留几分之一秒

答案 5 :(得分:1)

我可以修复渲染的唯一方法是在UIWebView上调用reload,但它并不漂亮。

答案 6 :(得分:1)

这是一个不使用webview的私有子视图的解决方案。 它并不完美,但是在没有使用重新加载或冒着被拒绝的风险的情况下进行解决方法。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    for (UIView *v in [web subviews]) {  
        [self performSelector:@selector(correctPDFView:) withObject:v afterDelay:0.0];  
    }  
    return YES;  
}

-(void)correctPDFView:(UIScrollView*)scroll{   
    [scroll setZoomScale:scroll.minimumZoomScale animated:NO];  
    [self performSelector:@selector(correctPDFView2:) withObject:scroll afterDelay:0.5];  
}

-(void)correctPDFView2:(UIScrollView*)scroll{  
    [scroll setZoomScale:scroll.minimumZoomScale+0.01f animated:YES];  
    [self performSelector:@selector(correctPDFView3:) withObject:scroll afterDelay:0.5];  
}

-(void)correctPDFView3:(UIScrollView*)scroll{  
    [scroll setZoomScale:scroll.minimumZoomScale animated:YES];  
}