如何告诉我的UITableViewCell在内容更改时自动resize?

在我的cell.xib中,我有一个标签,所有的边都有约束。 我已经将该标签设置为lines = 0line-break = word wrap 。 然后,我这样做到我的TableView:

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

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

问题是 – 如何告诉我的UITableView“重新计算”一次内容在单元格中更改的大小?

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

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

有一个文件化的方式来做到这一点。 请参阅UITableView.beginUpdates() 文档 :

您也可以使用此方法,然后使用endUpdates方法在不重新加载单元格的情况下对行高进行更改。

所以,正确的解决scheme是:

 tableView.beginUpdates() tableView.endUpdates() 

另外请注意,有一个没有logging的function – 你也可以在这里为更新animation添加一个完成处理程序:

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

然而,轻轻一点,它没有logging(但它的作品,因为UITableView使用CATransaction的animation)。

我已经find了最好的方法来检查高度是在任何文本更改后,按顺序调用:

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

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

您可以通过此代码获得自动细胞高度

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

下面是带有演示的这个解决scheme的参考:

GitHub的-RayFix-MultiLineDemo

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

 - (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]; } } 

我明白了你的观点,之前我遇到过这个问题。
你的单元格在AutoLayout中,你希望单元格自己改变。 这里推荐的答案是: 在UITableView中使用自动布局来实现dynamic单元布局和可变的行高 ,所以我们不再讨论这个问题。

所以在这里我们关注你的问题。

由于您的单元格内容不断变化,这意味着内容已更新。 这里我们假设内容是一个标签。 我们设置标签的文字,当然标签的高度也许会改变。

问题在于:标签的变化如何通知细胞更新?

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

我认为它会起作用!

以下是详细步骤:
1.我们设置单元格子视图的约束条件(我认为已经完成)
2.其中一个标签的高度本身就改变了(我认为也是这样)
3.获得标签的新高度,更新标签的高度限制(我们必须做的)

似乎你想重新加载特定的单元格/单元格根据内容的变化

这里我们有几个选项

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

要不然

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

但是最好的select是重新加载特定的单元格,

为什么因为当你要求你的UITableView实例重新加载一些单元格时,tableview会询问它的数据源(-tableView:cellForRowAtIndexPath :)以获得更新的内容,以便重新加载的单元格将具有更新大小和更新内容。

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

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

看看这个答案: 使用UITableView中的自动布局dynamic单元格布局和可变的行高

在这里描述了如何实现dynamic细胞大小。

作为testing的build议尝试添加setNeedsLayout到:

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

要么

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

您只能通过执行下面的方法来调整您的单元格高度

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