调整UIWebView的高度以适应内容大小

10

我正在将任意长度的HTML字符串加载到UIWebView中,然后显示在UITableViewCell中。我不希望这个UIWebView能够独立于UITableView滚动,因此我必须调整其高度以适应内容。

这个UITableViewCell还可以折叠,当处于折叠状态时不显示UIWebView

问题是,我如何知道它的高度,以便让heightForRowAtIndexPath返回正确的值,从而使表格显示和滚动正确?

以下是一些示例代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0)
    return 286;

if (indexPath.row == 1) {
    if (analysisExpanded)
        return analysisWebViewHeight + 39;
    else 
        return 52;
}

if (sourcesExpanded)
    return sourcesWebViewHeight + 39;

return 53;

很简单。39是我在带有webview的单元格中放置一些标题内容的高度。

我正在从nib加载单元格的“扩展视图”,所以为了获取webview,我调用viewForTag:

        UIWebView* sourcesWebView = (UIWebView*)[cell viewWithTag:1];
        [sourcesWebView setBackgroundColor:[UIColor clearColor]];
        [sourcesWebView loadHTMLString:placeholder baseURL:[NSURL URLWithString:@"http://example.com/"]];
        sourcesWebViewHeight = [[sourcesWebView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight"] floatValue];
        [sourcesWebView setFrame:CGRectMake(sourcesWebView.frame.origin.x, sourcesWebView.frame.origin.y, sourcesWebView.frame.size.width, sourcesWebViewHeight)];

sourcesWebViewHeight是一个iVar,在cellForRowAtIndexPath中被上述代码更新。如果用户点击单元格三次,展开-折叠-展开,并稍微滚动,最终会得到正确的高度。

我尝试使用一个仅存储在内存中的UIWebView对象来“预加载”高度,但由于某种原因它从未返回正确的数字。


在UIWebView文档中,苹果公司严格禁止在UITableView中使用UIWebView。 - makboney
我们已经发布了几个带有Web视图的单元格应用程序,没有任何问题。 - Denis
同样的问题可以在这里找到更多更好的答案。 - i--
4个回答

5
问题在于在网页视图渲染之前,我试图获取滚动大小。通过实现didFinishLoad代理方法后,我的原始JavaScript可以很好地获取高度。

2

对于iOS Safari,您需要使用以下行:

NSInteger height = [[sourcesWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] integerValue];

document.documentElement.scrollHeight在此浏览器中不起作用。

为了确保一切正常,您需要在加载完成 Web 视图后调用它 =)

更新:另一个选择是,仅适用于 iOS5,他们已将 scrollView 属性添加到 UIWebView 中,您可以在其中获取 contentSize


1

由于webViewDelegate可以在HTML代码加载时获取webView的高度,所以tableview:heightForRowAtIndexPath:方法会进入一个无限循环,试图检索位于tableView单元格中的webView:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    float height;

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UIWebView *webContent = (UIWebView *) [cell viewWithTag:tagTableSingleContentWeb];
    CGRect frame = webContent.frame;

    height = frame.origin.y + frame.size.height + 30;

    return height;
}

以上是我尝试更改tableView单元格时插入HTML代码到tableView单元格内部的webView的代码,但会导致无限循环...
我仍在尝试找出其他方法。
附言:当webView位于ScrollView中时,使用WebViewDelegate方式是可以的,但我还不知道如何使其在TableView单元格内部工作。

你找到解决方案了吗?我也遇到了同样的问题。 - Yestay Muratov

0

在这里链接可以找到更多更好的关于同样问题的答案。只是觉得对某些人可能有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接