2009-04-13 85 views
70

我试图创建一个可变高度行的UITableView作为答案解释this question如何根据内容在可变高度UITableView内确定UIWebView高度?

我的问题是每个单元包含一个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; 
    } 

自己是从笔尖,这简直是含有UIWebView一个UITableViewCell加载的细胞。 (如果单元格将自己调整为最大的html内容,虽然可变高度会更好)也是没问题的。

+0

你有没有想过如何做到这一点?下面的答案似乎让你的高度,但直到你需要它之​​后。如何计算heightForRowAtIndexPath的高度是否必须依赖webViewDidFinishLoad中的回调(webview委托)调用? – pbx 2012-03-13 05:17:09

+0

嗨然后最后如何ü确定webview的高度我也有同样的问题... – 2012-04-28 12:35:18

+0

任何人都有一个解决方案?仍然不知道这个.. – mikemike396 2013-05-24 18:11:11

回答

76

这段代码对于表视图的使用可能太慢了,但没有办法。它看起来没有其他选择,因为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); 
} 
+0

听起来像它可以使工作,但是我已经在表视图中尝试过,它返回一个空字符串(我猜是因为webview没有完成加载)。我想我可以预先计算一个离屏web视图,并缓存tableview的结果。 – frankodwyer 2009-04-25 23:49:29

+0

你在测量webViewDidFinishLoad中的高度吗?这是代表回调,指示加载完成。它不应该返回一个空字符串。 – duncanwilcox 2009-04-27 18:50:39

+0

这几乎就是我所做的。虽然我有一个问题,即webview在加载完成之前无法返回它的大小,而当表需要知道它的大小时,它可能没有。有没有人有如何解决这个问题的想法? – 2010-06-14 13:49:06

28

我很高兴找到你的答案,这个javascript技巧对我来说效果很好。

但是,我想说的话,有也是“sizeThatFits:”方法:

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

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

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

所以,这就是为什么我很高兴找到你的解决方案,无论如何工作。

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,如果它失败。

3

如果你第一次使用sizeThatFits的值不好,这里是我遇到的一个可能的原因:一个外部CSS的错误。 似乎很快调用webViewDidFinisLoad,然后才能检索外部CSS,并完全构建Web文档。 我认为如果您因缓存而重新加载,该错误​​消失。

一个小窍门:尽快在应用程序中预先加载一个虚拟的UIWebView。

SDK:IOS4

4

的问题-sizeThatFits:是,它不工作的开箱,至少不会在iOS 4.1。它只是返回webView的当前大小(不管它是用CGSizeZero调用还是任意的非零大小)。

我发现它实际上工作,如果你在调用-sizeThatFits:之前减小webView的帧高度。

见我的解决方案:How to determine the content size of a UIWebView?

3

测量的WebView工作,但只有当它加载其内容

  • 制作的WebView小(如为5px)
  • 负载,并等待完成
  • 调用sizeToFit就可以了
  • 获取大小THEN
  • 重新加载表格v IEW(返回单元格的正确高度)

广告:d在Github上查看我的M42WebviewTableViewCell类,与此

2

更好的方法是使用scrollView.contentSize.height属性,如下面的斗争。

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