Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPad UIWebView PDF rendering is giving me weird visual artifacts

I am having some difficulty using a UIWebView to render PDF files on the iPad. Everything works fine in portrait mode, but turning the device to landscape produces strange visual quirkiness. Zooming in (but not out) even the slightest will correct it, but obviously that's not an ideal workaround.

The issue occurs with any PDF file (I have tried several, all stored locally in the bundle, not retrieved from the web). I also created a clone of the project for iPhone, which seems to work just fine, so the problem is iPad-specific. The problem occurs both in the simulator as well as on a physical iPad.

Screenshot

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

Code

 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];

Thanks so much for your time.

like image 271
ashicus Avatar asked Apr 18 '10 00:04

ashicus


4 Answers

This is indeed a known bug, according to Apple.

A better work-around is to call

-[UIView setNeedsDisplay]

on every subview in the web view instance, like so:

for(UIView* subview in webView)
{
    for(UIView *reloadView in [subview subviews])
    {
        if([reloadView class] != [UIImageView class])
        {
            [reloadView setNeedsDisplay];
        }
    }
}
like image 136
user490043 Avatar answered Oct 13 '22 18:10

user490043


The only way to fix this problem is to when ever you rotate/change the size of your UIWebView is to call loadData: again. This leaves it on for around a second (depending on file size) but is not a terrible fix for now. It is certainly much better than calling loadRequest: again!

The bug has been submitted to apple and has been approved. No word on a fix date.

like image 38
Jesse Naugher Avatar answered Oct 13 '22 17:10

Jesse Naugher


It's a confirmed bug. I found a workaround that works for me. You can use this code when you resize your view or in the autorotate event.


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

That's it.

like image 2
live-love Avatar answered Oct 13 '22 18:10

live-love


I believe this is one of the many simulator bugs.

like image 1
jamone Avatar answered Oct 13 '22 17:10

jamone