代码之家  ›  专栏  ›  技术社区  ›  ashicus

ipad uiwebview pdf呈现给我的是奇怪的视觉效果

  •  5
  • ashicus  · 技术社区  · 14 年前

    我在使用uiwebview在iPad上呈现PDF文件时遇到了一些困难。在肖像模式下,一切都可以正常工作,但将设备转向景观会产生奇怪的视觉效果。放大(但不缩小)即使是最轻微的放大也会纠正它,但显然这不是一个理想的解决方法。

    任何PDF文件都会出现此问题(我尝试了几种方法,所有方法都存储在捆绑包中,而不是从Web检索)。我还为iphone创建了一个项目的克隆版本,它看起来工作得很好,所以问题是ipad特有的。问题既出现在模拟器中,也出现在物理iPad上。

    屏幕截图

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

    < H2>代码
    nsstring*filepath=[[nsbundle mainbundle]pathforresource:@“test”of type:@“pdf”];
    nsdata*data=[nsdata datawithcontentsofile:filepath];
    
    [自浏览WebVIEW ]
    数据加载:数据
    mimetype:@“应用程序/pdf”
    文本编码名称:@“UTF-8”
    Baseull:nIL];
    < /代码> 
    
    

    非常感谢您抽出宝贵的时间。

    任何PDF文件都会出现此问题(我尝试了几种方法,所有方法都存储在捆绑包中,而不是从Web检索)。我还为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 回复  |  直到 8 年前
        1
  •  2
  •   Jesse Naugher    14 年前

    解决此问题的唯一方法是,当您旋转/更改uiWebView的大小时,再次调用loadData:。这会让它保持大约一秒钟(取决于文件大小),但目前还不是一个糟糕的修复。这肯定比调用loadRequest要好得多:再次!

    该漏洞已提交给苹果公司,并已获得批准。没有固定日期的消息。

        2
  •  3
  •   user490043    14 年前

    据苹果公司称,这确实是一种已知的病毒。

    更好的解决办法是打电话

    -[UIView setNeedsDisplay]
    

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

    for(UIView* subview in webView)
    {
        for(UIView *reloadView in [subview subviews])
        {
            if([reloadView class] != [UIImageView class])
            {
                [reloadView setNeedsDisplay];
            }
        }
    }
    
        3
  •  2
  •   live-love    14 年前

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

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

    就是这样。

        4
  •  1
  •   jamone    14 年前

    我相信这是许多模拟器错误之一。

        5
  •  1
  •   Jon    14 年前

    这件事也发生在我身上,真让人恼火。有人知道苹果是否知道这个问题吗?似乎他们的代码有问题,而不是我们做错了什么。唯一能解决这个问题的方法是告诉uiWebView在方向改变后重新加载PDF——这绝对不理想(尤其是对于大型PDF)——即使这样,在正确的版本出现之前,视觉印章仍然会保留一小部分秒。

        6
  •  1
  •   greenisus    14 年前

    修复渲染的唯一方法是调用uiWebView上的reload,但它并不漂亮。

        7
  •  1
  •   Hazmodan    13 年前

    这是一个不使用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];  
    }