当内容发生变化时,如何告诉我的UITableViewCell“自动调整大小”?

时间:2016-03-13 20:31:57

标签: ios swift

在我的cell.xib中,我有一个标签,其所有方面都有约束。我已将该标签设置为lines = 0line-break = word wrap。然后,我对我的TableView执行此操作:

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100.0

一切都很好,我的UITableViewCell是自动高度。如果文本很长,那么我的tableView会智能地计算大小。

问题是 - 一旦内容在单元格中发生变化,如何告诉我的UITableView“重新计算”大小?

我的单元格可以调用它的委托,在这个委托中,我希望TableView重新绘制高度。

现在,我的细胞中的内容不断变化,但细胞高度永远不会改变。

9 个答案:

答案 0 :(得分:30)

有记录的方法可以做到这一点。请参阅UITableView.beginUpdates() documentation

  

您也可以使用此方法,然后使用endUpdates方法为行高度的更改设置动画,而无需重新加载单元格。

所以,正确的解决方案是:

tableView.beginUpdates()
tableView.endUpdates()

另请注意,有一个未记录的功能 - 您也可以在此处为更新动画添加完成处理程序:

tableView.beginUpdates()
CATransaction.setCompletionBlock {
   // this will be called when the update animation ends
}

tableView.endUpdates()

然而,轻描淡写地说,它没有记录(但它起作用,因为UITableView使用CATransaction来制作动画。

答案 1 :(得分:6)

我发现检查高度的最佳方法是在完成任何文本更改后按顺序调用:

self.tableView.beginUpdates()
self.tableView.endUpdates()

这会导致tableView检查所有可见单元格的高度,并且会根据需要进行更改。

答案 2 :(得分:2)

我认为最简单的解决方案是重新加载特定的单元格。例如:

- (void)yourDelegateMethodOfCell:(UITableViewCell *)cell {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    //If cell is not visible then indexPath will be nil so,
    if (indexPath) {
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

答案 3 :(得分:2)

您可以通过此代码获得自动单元格高度

tableView.beginUpdates()
// add label text update code here 
// label.numberOfLines = label.numberOfLines == 0 ? 1 : 0
tableView.endUpdates()

以下是使用demo的

对此解决方案的引用

GitHub-RayFix-MultiLineDemo

答案 4 :(得分:0)

我明白了,我之前遇到了问题 您的单元格处于AutoLayout中,您希望单元格自行更改。以下是建议的答案:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights,因此我们不再讨论这个问题。

所以我们专注于你的问题。

由于您的单元格内容不断变化,这意味着内容已更新。在这里,我们假设内容是一个标签。我们设置了标签的文字,标签的高度肯定会有所改变。

重点是:标签的更改如何通知单元格更新?

我们使用 AutoLayout ,当然我们必须更新标签的高度限制。

我认为它会奏效!

以下是详细步骤:
1.我们为单元格的子视图设置了约束。(我认为已经完成了) 2.其中一个标签的高度会自行改变。(我认为它也是如此) 3.我们获得标签的新高度,并更新标签的高度约束。(我们必须做的)

答案 5 :(得分:0)

似乎您想根据内容更改重新加载特定的单元格/单元格

这里有几个选项

1)需要重新加载整个表视图。

或者

2)根据内容变化重新加载特定的细胞/细胞。

但首选的选项是重新加载特定的单元格,

为什么呢 当您要求UITableView实例重新加载几个单元格时,tableview将询问其数据源(-tableView:cellForRowAtIndexPath :)以获取更新的内容,以便重新加载的单元格将具有更新的大小&更新内容以及。

尝试在内容/高度需要根据内容更新时重新加载单元格

希望有所帮助! 快乐的编码:)

答案 6 :(得分:0)

看一下这个答案:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

如何实现动态单元尺寸的描述非常彻底。

作为测试建议,请尝试将setNeedsLayout添加到:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 

答案 7 :(得分:0)

要禁用烦人的 tableView 动画:

UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
// cell.titleLabel?.text = "title"
// cell.detailTextLabel?.text = "Very long text ..."
// cell.detailTextLabel?.numberOfLines = 0
tableView.endUpdates()
UIView.setAnimationsEnabled(true)

答案 8 :(得分:-1)

您可以通过仅实施以下方法来调整细胞高度

 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}