为某些行明确设置行高,但对于其他行使用估计行高

4
我有一个包含UIWebViewUITableViewCell单元格,该单元格将web视图作为其子视图,并且网页视图填充整个单元格。我正在使用estimatedRowHeight来计算行高。但是,在构建表格视图时,单元格没有高度,因为Web视图尚未加载其内容,因此单元格没有内容。因此,estimatedRowHeight返回44而不是Web视图内容的正确高度。
请问有人知道如何在内容不立即设置时正确计算行高吗?是否有一种方法可以估计某些单元格的高度并显式设置其他单元格的高度,而这些单元格都在同一个表格视图中?
以下是我使用estimatedRowHeight的方式:
self.tableView.estimatedRowHeight = 200;
self.tableView.rowHeight = UITableViewAutomaticDimension;

我没有使用委托方法。我尝试过,但结果没有改变。我使用的单元格具有一个XIB,该XIB还使用自动布局约束。需要明确的是,单元格确实出现了,网页视图也被添加到了单元格中。问题在于单元格的高度不足以显示整个网页视图。网页视图加载了音频播放器的HTML嵌入代码。

2个回答

13

我进行了一些尝试,并发现您可以按照以下方式使用UITableViewAutomaticDimension

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableSection *tableSection = (self.tableModel.sections)[indexPath.section];

    if (tableSection.sectionType == TableSectionTypeWebView)
    {
        return 120;
    }
    else
    {
        return UITableViewAutomaticDimension;
    }
}

这基本上是说,对于任何WebView部分,请使用高度为120,但对于其他所有内容,我希望你自己计算高度。我在这里使用了自己的自定义表格模型(即TableSection、sectionType等)

我不得不在我的init方法中添加self.tableView.estimatedRowHeight = 200;才能实现这一点。

现在,我可以提供预估行高,但还可以明确地设置某些部分甚至某些行的行高,如果需要的话。

我没有看到任何关于此的文档,但我用可变长度字符串进行了测试,它完全正常。


谢谢分享...特别是关于将self.tableView.estimatedRowHeight设置为某个值的部分。我之前尝试了你的其他方法,但最终转向另一个解决方案。然后我尝试了这个,那就是关键 :) - dustinrwh
此解决方案截至2017年10月12日(xcode9,swift3.2)已失效。 - Async-
它仍然可以工作,我没有任何问题 - 我仍在使用它。@Async- 然而,在iOS 11中,AutomaticDimension应用于所有的TableView,因此您不必指定它。 - tentmaking

0
你需要把你的类设置为UIWebViewDelegate,在每个UITableViewCell的UIWebView中将你的类设置为代理。
-(void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGRect frame = aWebView.frame;
    frame.size.height = 1;
    aWebView.frame = frame;
    //Asks the view to calculate and return the size that best fits //its subviews.
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    frame.size = fittingSize;
    aWebView.frame = frame;
    [self.tableView beginUpdates];
    [self.tableView  endUpdates];
}

现在您可以获取UIWebView的高度并将其设置为行高,因为一旦调用'beginUpdates'方法,以下方法将再次被调用。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:  (NSIndexPath*)indexPath {
    return _webView.frame.size.height;
}

希望这能帮到你


好的,我明白那样做的原理。然而,这种解决方案将不允许我使用estimatedRowHeight。在这种特定情况下,我有一些需要动态调整大小的单元格,但是网页视图单元格将保持恒定高度。问题还问道,“是否有一种方法可以估计某些单元格的高度并显式设置其他单元格的高度,在同一个表视图中?”目前我不确定是否有这样的方法。感谢您的答案,如果我找不到其他解决方案,我会接受它。 - tentmaking
关于使用“estimatedRowHeight”,我不太确定如何处理,但是如果将您的类设置为每个UITableViewCell中创建的UIWebview的委托,则每次WebView完成加载时都会调用“webViewDidFinishLoad”,因此WebView单元格的高度不同,而是取决于Web视图内部的内容。 - Shabarinath Pabba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接