iPhone SDK - UIWebView has a grey box over it

后端 未结 7 501
长发绾君心
长发绾君心 2021-01-14 01:30

Sometimes, my UIWebView will have a grey box over part or all of the content. I can\'t make heads or tails of why it\'s happening. It happens regularly for certain content.

相关标签:
7条回答
  • 2021-01-14 02:05

    I ran into the same issue when dynamically resizing a UIWebView. Here's what worked for me:

    #define LAYER_FOR(ui)                        [(ui) layer]
    #define FRAME_FOR(ui)                        [LAYER_FOR((ui)) frame]
    #define SET_FRAME_FOR(ui, frame)             [LAYER_FOR((ui)) setFrame: (frame)]
    
    + (void) setHeightTo: (CGFloat *) height_ptr forView: (UIView *) a_view {
      CGFloat height = *height_ptr;
    
      CGRect existing_frame = [[a_view layer] frame];
      existing_frame.size.height = height;
    
      // need to reassign the same frame !?
      NSLog(@"setting text view: %@ to height: %f", a_view, (float) height);
      SET_FRAME_FOR(a_view, existing_frame);
    }
    
    + (void) resizeWebView: (UIWebView *) webView {
      NSString *js = @"                                                                                               \
        var __html_element = document.getElementsByTagName('html')[0];                                                \
        var __height_string = document.defaultView.getComputedStyle(__html_element, null).getPropertyValue('height'); \
        __height_string.replace('px', ''); \
      ";
    
      NSString *heightString = [webView stringByEvaluatingJavaScriptFromString: js];
      float height = [heightString floatValue];
    
      if (height != UI_VIEW_HEIGHT(webView)) {
        [self setHeightTo: &height forView: webView];
    
        // resize scrollView inside webview to the same height
        UIScrollView *webScroller = [[webView subviews] lastObject];
        [self setHeightTo: &height forView: webScroller];
      }
    }
    

    I called this code from webview's delegate 'webViewDidFinishLoad:' method.

    Basically, the trick is to resize the webScroller inside webview.

    Thanks to Padraig for the suggestion to nudge the webview's subview (the scrollview).

    0 讨论(0)
  • 2021-01-14 02:08

    Nudging the UIScrollView in the UIWebView it fixes this for me:

    [UIScrollView *webScroller= [[webView subviews] lastObject];    
    [webScroller setContentOffset:CGPointMake(0,1) animated:NO];
    [webScroller setContentOffset:CGPointMake(0,0) animated:NO];
    
    0 讨论(0)
  • 2021-01-14 02:08

    I found a very intersting post about that, it solved the problem for me : link ttp://pinchzoom.com/blog/items/view/1386/one-of-the-problems-with-the-uikit-at-the-moment-is-an-issue-embedding-a-uiwebview-within-a-table

    Hope that helps

    0 讨论(0)
  • 2021-01-14 02:13

    All UIViews have a size limit of 1024x1024 pixels. This is stated at the end of the Overview section of the UIView documentation.

    If your web view must have more than 1024px of content, you will have to take it out of the parent scroll view and let it manage scrolling on its own.

    0 讨论(0)
  • 2021-01-14 02:14

    I've used stringByEvaluatingJavaScriptFromString plus moving UIWebView origin. Design overview: I had a set of controls(UIImage in this example) above(I mean frame.origin.y) UIWebView. So, layout was:

    UIView
      UIScrollView
        UIImageView
        UIWebView
    

    Since UIWebView doesn't support scrolling in such hierarchy I've rearrange it like:

    UIView
      UIScrollView
        UIImageView
      UIWebView
    

    My view controller is delegate for UIWebViewDelegate and UIScrollViewDelegate. Then,

    - (void)viewDidLoad
    {
      // set delegates
      self.scrollView.delegate = self;
      self.webView.delegate = self;
    
      // store original UIWebView position in ivar
      webViewPosY = self.webView.frame.origin.y;
    
      // load html into UIWebView
      [self.webView loadHTMLString:someHTML baseURL:nil];
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
      // get UIWebView size and store in ivar
      webSize = [self.webView sizeThatFits:CGSizeMake(1.0,1.0)];
    
      // set proper content height for UIScrollView
      CGSize contentSize = self.scrollView.contentSize;
      contentSize.height = webViewPosY + webSize.height;
      self.scrollView.contentSize = contentSize; 
    
      // set UIWebView's frame height same as UIScrollView has
      CGRect wf = self.webView.frame;
      wf.size.height = self.scrollView.frame.size.height;
      self.webView.frame = wf;
    }
    
    // scrolling logic:
    // 1.  if origin of UIWebView > 0 then move UIWebView itself
    // 2.  if origin of UIWebView == 0 then scroll with javascript
    // 3.  if origin is 0 and whole html is scrolled then move UIWebView again(this happens to support scroll "bouncing", or if you have some views below UIWebView
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
      CGFloat scrollPosY = self.scrollView.contentOffset.y;
    
      // (1) and (2) ifs
      // how much to move UIWebView
      CGFloat scrollOriginY = (scrollPosY >= webViewPosY) ? webViewPosY : scrollPosY;
      // how much to scroll via JS
      CGFloat scrollJSY = scrollPosY - scrollOriginY;
    
      // (3) if
      if ( scrollPosY > (webSize.height - scrollViewSize.height + webViewPosY ) )
        scrollOriginY += scrollPosY - (webSize.height - scrollViewSize.height + webViewPosY);
    
      // scroll with JS
      [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.scrollTop = %f;", scrollJSY]];
    
      // move UIWebView itself
      CGRect wf = self.webView.frame;
      wf.origin.y = webViewPosY - scrollOriginY;
      self.webView.frame = wf;
    }
    

    This works just fine for me.

    0 讨论(0)
  • 2021-01-14 02:15

    I have been dealing with this glitch as well, and have opened a bug report at apple. I would have commented above, but I don't have the 50 rep yet.

    For anyone else encountering this glitch, send them a report, I included a full project demonstrating it, with a few screenshots from another app I am working on. The more bug reports they get on a topic, the more likely they are to address it, apparently.

    https://bugreport.apple.com/

    0 讨论(0)
提交回复
热议问题