如何确定基于内容的UIWebView高度,在一个可变的高度UITableView?

我正在试图创build一个可变高度行的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; } 

单元格本身是从一个笔尖加载的,它只是一个包含UIWebViewUITableViewCell 。 (如果单元格将自己调整为最大的html内容,虽然可变高度会更好)也是没问题的。

这个代码对于表视图的使用可能太慢了,但是这个技巧。 看起来没有其他select,因为UIWebView不提供对DOM的直接访问。

在一个视图控制器的viewDidLoad我加载一些HTML在Web视图中,当加载完成后运行一些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); } 

我很高兴find你的答案,JavaScript技巧对我很好。

不过,我想说的是,还有“sizeThatFits:”方法:

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

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

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

所以,这就是为什么我很高兴find你的解决scheme在任何情况下工作。

这似乎工作。 目前。

 - (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。

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

我发现,如果你在调用-sizeThatFits:之前减小了webView的框架高度,它实际上是有效的。

看我的解决scheme: 如何确定一个UIWebView的内容大小?

如果你在第一次使用sizeThatFits的时候遇到了错误的值,那么这里就是我遇到的一个可能的原因:一个外部CSS的错误。 似乎很快调用webViewDidFinisLoad,在检索外部CSS之前,完全构buildWeb文档。 如果因为caching而重新加载,我认为这个bug会消失。

一个小技巧:在您的应用程序中尽快预装一个虚拟的UIWebView。

SDK:IOS4

测量一个webview的作品,但只有当它已经加载其内容

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

广告:: D在Github上看到我的M42WebviewTableViewCell类与此斗争

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

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSLog(@"%f",webView.scrollView.contentSize.height); }