【问题标题】:Deciding height for UIScrollView with UIWebView inside使用 UIWebView 确定 UIScrollView 的高度
【发布时间】:2014-05-28 20:08:55
【问题描述】:

我有一个详细视图,我想在其中显示文章的标题、副标题和内容。我希望能够使用 HTML 来格式化文本,所以我使用 UIWebView 来显示文章正文。这非常有效。

然而,所有这些都在 UIScrollView 中,所以我的问题是我必须计算 UIScrollView 的高度?

这就是今天的工作方式:

这就是它在 Storyboard 中的样子:

那么我需要弄清楚的是,计算 UIScrollView 正确高度的正确代码和语法是什么?在几件事中,我尝试了[self.scrollView sizeToFit],但没有运气。

编辑:显然它使用下面的代码设置了正确的高度,但似乎视图永远不会更新。

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    // get height of content in webview
    CGFloat height = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue];

    // set new frame height
    CGRect frame = webView.frame;
    frame.size.height = height;
    webView.frame = frame; // webview is now correct height

    // set new frame height for scrollview (parent of webview)
    CGRect scrollFrame = self.scrollView.frame;
    scrollFrame.size.height = webView.frame.origin.y + height;
    self.scrollView.frame = scrollFrame;

    // log to console for cross checking
    NSLog(@"new frame: %f, scrollview frame: %f", scrollFrame.size.height, self.scrollView.frame.size.height);
}

控制台报告了明显正确的高度:

new frame: 582.000000, scrollview frame: 582.000000

在 Photoshop 中快速检查一下,这似乎是正确的:

绿色和蓝色区域的总和值为582像素,但滚动视图仍然只是将504像素区域从导航栏下方滚动到屏幕底部(到标签栏底部)。

【问题讨论】:

    标签: ios uiwebview uiscrollview


    【解决方案1】:

    webview 内部有一个滚动视图。您可以通过webview.scrollView.contentSize查询其大小。你必须等到 webview 完成渲染。

    所以,在-webViewDidFinishLoad:委托方法中,你可以通过webView.scrollView.contentSize.height得到webView的最佳高度。然后,您可以将 webView 调整到此高度并适当地布局其他视图。如果所有这些都在自定义视图中完成,那么正确的做法可能是调用[theView setNeedsLayout] 并在theView 中覆盖-layoutSubviews

    您还应该将webView.scrollView.alwaysBounceVertically 设置为NO

    【讨论】:

    • 我使用[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] 来计算webview 的高度,这会返回webview 内容的正确高度。所以你的意思是,如果我将 webview 设置为 1000 px 高,我可以使用 scrollview 滚动 1000 px?
    • 有内滚动视图和外滚动视图:innerScrollView=webView.scrollView,outerScrollView=webView.superview。基本上,我只是提供了一种通过询问 innerScrollView 的 contentSize 来计算 webView 最佳高度的方法。 (我不知道 javascript 解决方案。)outerScrollView 的布局我无能为力,但这应该没问题。如果您知道 webview 的高度正好为 101pt,您将如何正确布局所有内容?现在用正确计算的 webView 高度替换代码中的幻数 101。
    • 是否可以在webViewDidFinishLoad中设置UIScrollView的高度?当注销webview.frame.size.height + webview.frame.origin.y 时,它会报告正确的高度,但是当将 UIScrollView 设置为这个高度时,什么也没有发生。
    【解决方案2】:

    我解决了这个问题。

    首先,只需将 UIWebView 扩展至高于内容的高度(例如 2000 像素)。

    使魔术发生的委托方法代码

    -(void)webViewDidFinishLoad:(UIWebView *)webView
    {
        // set height for webiew
        webView.autoresizesSubviews = NO;
        webView.translatesAutoresizingMaskIntoConstraints = YES;
        webView.scrollView.autoresizesSubviews = NO;
        webView.scrollView.translatesAutoresizingMaskIntoConstraints = YES;
    
        CGFloat height = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('content').clientHeight;"] floatValue] + 80; // +80 for tabbar and spacing
        CGRect frame = webView.frame;
        frame.size.height = height;
        webView.frame = frame;
    
        // fix height of scroll view as well
        self.scrollView.translatesAutoresizingMaskIntoConstraints = YES;
        self.scrollView.contentSize = CGSizeMake(320, (self.webView.frame.origin.y + self.webView.frame.size.height));
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-11
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2011-12-11
      • 2015-06-12
      • 2010-10-19
      相关资源
      最近更新 更多