调整UIWebView的高度以适合内容



我正在加载一个任意长度的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是由上述cellForRowAtIndexPath中的代码更新的iVar。如果用户点击单元格三次,展开-折叠-展开,并进行一点滚动,最终它会得到正确的高度。

我尝试通过使用仅内存的UIWebView对象"预加载"高度,但由于某种原因,从未返回正确的数字。

问题是我试图在web视图有机会渲染它之前获得滚动条的大小。

在实现didFinishLoad委托方法后,我的原始javascript可以很好地获得高度

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

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

document.documentElement.scrollHeight不能在这个浏览器中工作。

只是为了确保一切都是正确的,你需要在你的web-view完成加载后调用这个=)

更新:另一个选项,只适用于iOS5,他们已经添加了scrollView属性到UIWebView,在那里你可以得到contentSize .

由于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;
}

以上是代码,我试图改变tableView单元格时,我插入HTML代码到webView内的tableView单元格,但它会导致无限循环....

我还在想别的办法。

注。WebViewDelegate的方式是ok的,当webView位于ScrollView,但我不知道如何使它的工作内部TableView单元格尚未。

对于几乎相同的问题,也可以在这里找到更多更好的答案。只是觉得可能对别人有帮助。

最新更新