如何根据内容在可变高度UITableView内确定UIWebView高度?

fra*_*yer 69 iphone cocoa-touch uiwebview uitableview ios

我正在尝试创建一个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;
    }
Run Code Online (Sandbox Code Playgroud)

细胞本身是从笔尖加载的,笔尖只是一个UITableViewCell含有a 的笔尖UIWebView.(如果细胞只是将自己调整到html内容的最大值,那也没关系,尽管可变高度会更好).

dun*_*cox 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我改为使用:NSString*output = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"]; (37认同)
  • 对于iOS 4.3,我必须执行以下操作:我的webView(即1px)的高度很小,并执行BadPirate推荐的调用,然后调整滚动视图的内容值和Web视图的帧值. (3认同)
  • 您必须将初始UIWebView的高度设置为至少1px,否则在进行JS调用时,您将获得返回的屏幕高度. (2认同)

Unf*_*ter 28

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

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

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];
Run Code Online (Sandbox Code Playgroud)

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

通常,因为使用UIWebViews,它似乎只在第二次加载时工作(我使用"loadHTMLString:"方法,是的,我从委托"didFinishLoad:"方法调用"sizeThatFits:").

所以,这就是为什么我很高兴找到适用于任何情况的解决方案.


Dav*_*ton 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这比这更好:[webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo \").offsetHeight;"];?问题是webview在完成加载之前不能返回它的大小,当表需要知道它的大小时它可能没有. (3认同)