在我的cell.xib中,我有一个标签,其所有方面都有约束。我已将该标签设置为lines = 0
和line-break = word wrap
。然后,我对我的TableView执行此操作:
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100.0
一切都很好,我的UITableViewCell是自动高度。如果文本很长,那么我的tableView会智能地计算大小。
问题是 - 一旦内容在单元格中发生变化,如何告诉我的UITableView“重新计算”大小?
我的单元格可以调用它的委托,在这个委托中,我希望TableView重新绘制高度。
现在,我的细胞中的内容不断变化,但细胞高度永远不会改变。
答案 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的
对此解决方案的引用答案 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;
}