71

我正在尝试创建一个UITableView高度可变的行,如该问题的答案中所述

我的问题是每个单元格都包含UIWebView不同(静态加载)的内容,我无法弄清楚如何根据内容计算正确的高度。有没有办法做到这一点?我试过这样的事情:

   (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
       WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
       [cell setNeedsLayout];
       [cell layoutIfNeeded];
       return cell.bounds.size.height;
    }

单元格本身是从一个 nib 加载的,它只是一个UITableViewCell包含一个UIWebView. (如果单元格只是将自己调整为最大的 html 内容也可以,尽管可变高度会更好)。

4

7 回答 7

77

这段代码对于表格视图的使用来说可能太慢了,但可以解决问题。看起来没有其他选择,因为 UIWebView 不提供对 DOM 的直接访问。

在视图控制器中,viewDidLoad我在 webview 中加载了一些 HTML,加载完成后运行一些 javascript 以返回元素高度。

- (void)viewDidLoad
{
    [super viewDidLoad];
    webview.delegate = self;
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
    NSLog(@"height: %@", output);
}
于 2009-04-15T11:41:26.737 回答
28

我很高兴找到你的答案,javascript 技巧对我很有效。

但是,我想说还有“sizeThatFits:”方法:

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];

我们必须设置一个不同于零的首选大小,但除此之外,它通常总是有效的!

通常,因为使用 UIWebViews,它似乎只适用于第二次加载(我使用“loadHTMLString:”方法,是的,我从委托“didFinishLoad:”方法中调用“sizeThatFits:”)。

所以,这就是为什么我很高兴找到在任何情况下都有效的解决方案。

于 2009-06-06T13:09:51.403 回答
6

这似乎有效。目前。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat webViewHeight = 0.0f;
    if (self.subviews.count > 0) {
        UIView *scrollerView = [self.subviews objectAtIndex:0];
        if (scrollerView.subviews.count > 0) {
            UIView *webDocView = scrollerView.subviews.lastObject;
            if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
                webViewHeight = webDocView.frame.size.height;
        }
    }
}

如果失败,它应该安全地返回 0。

于 2009-08-06T23:26:30.090 回答
4

问题-sizeThatFits:在于它不能开箱即用,至少在 iOS 4.1 上不能。它只返回 webView 的当前大小(无论是使用 CGSizeZero 还是任意非零大小调用它)。

我发现如果在调用-sizeThatFits:.

请参阅我的解决方案:如何确定 UIWebView 的内容大小?

于 2010-10-14T21:13:23.230 回答
4

更好的方法是使用scrollView.contentSize.height属性,如下所示。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     NSLog(@"%f",webView.scrollView.contentSize.height);   
}
于 2015-08-29T23:43:18.037 回答
3

测量 webview 有效,但仅在它已加载其内容时

  • 使 webview 变小(如 5px)
  • 加载它并等待完成
  • 然后调用 sizeToFit
  • 获得尺寸 THEN
  • 重新加载表格视图(返回单元格的正确高度)

广告::D 在 github 上查看我的 M42WebviewTableViewCell 类

于 2012-11-24T11:01:02.737 回答
3

如果您第一次使用 sizeThatFits 但之后没有设置错误值,则可能是我遇到的一个原因:外部 CSS 的错误。在检索外部 CSS 和完全构建 Web 文档之前,似乎很快就会调用 webViewDidFinisLoad。我认为如果由于缓存而重新加载,该错误​​就会消失。

一个技巧:很快在你的应用程序中用一个虚拟的 UIWebView 预加载你的 CSS。

开发工具包:IOS4

于 2010-08-09T12:31:24.080 回答