如何确定基于内容的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; }
单元格本身是从一个笔尖加载的,它只是一个包含UIWebView
的UITableViewCell
。 (如果单元格将自己调整为最大的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); }