调整UIWebView高度以适应内容

时间:2011-11-29 08:27:21

标签: iphone objective-c

我正在将一个任意长度的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; 返回一个正确的值并允许表格正确查看和滚动?

以下是一些示例代码:

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

}

非常简单。 39是我在webview的单元格中的一些标题内容的高度。

我正在从笔尖加载单元格的“展开视图”,所以要获取我正在调用viewForTag的webview:

sourcesWebViewHeight

cellForRowAtIndexPath是由UIWebView中的上述代码更新的iVar。如果用户点击三次单元格,展开 - 展开 - 展开,并进行一点滚动,最终得到正确的高度。

我尝试使用仅限内存的{{1}}对象“预加载”高度,但由于某种原因从未返回正确的数字。

4 个答案:

答案 0 :(得分:5)

问题是我在Web视图有机会渲染之前尝试获取滚动大小。

在实现了didFinishLoad委托方法之后,我原来的javascript工作正常以获得高度。

答案 1 :(得分:2)

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

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

document.documentElement.scrollHeight无法使用此浏览器。

为确保一切正常,您需要在网络视图加载完毕后调用此方法=)

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

答案 2 :(得分:1)

由于webViewDelegate可以在加载HTML代码时获得webView的高度, tableview:heightForRowAtIndexPath:方法将进入无限循环 尝试检索位于tableView Cell中的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;
}

以上是当我将HTML代码插入到tableView单元格中的webView中时,我尝试更改tableView单元格的代码,但它会导致无限循环....

我仍然试图找出其他方法。

P.S。当webView位于ScrollView中时,WebViewDelegate方式正常,但我不知道如何让它在TableView单元格中工作。

答案 3 :(得分:0)

同样的问题可以找到更多更好的答案here。只是觉得它可能对某人有帮助。