繁体   English   中英

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

[英]How do I tell my UITableViewCell to “auto-resize” when its content changes?

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

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

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

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

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

现在,我的单元格中的内容不断变化,但单元格高度从未改变。

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

您还可以使用此方法后跟 endUpdates 方法来设置行高变化的动画,而无需重新加载单元格。

所以,正确的解决办法是:

tableView.beginUpdates()
tableView.endUpdates()

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

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

tableView.endUpdates()

但是,请CATransaction ,它没有记录(但它可以工作,因为UITableView使用CATransaction来制作动画)。

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

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

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

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

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

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

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

以下是此解决方案与演示的参考:

GitHub-RayFix-MultiLineDemo

我明白你的意思,我以前遇到过这个问题。
您的单元格在 AutoLayout 中,您希望单元格自行更改。 这里是推荐的答案: 在 UITableView 中使用自动布局进行动态单元格布局和可变行高,所以我们不再讨论。

所以在这里我们专注于您的问题。

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

重点来了:标签的变化如何通知单元格更新?

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

而且我认为它会起作用!

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

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

在这里我们有几个选择

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

要不然

2)根据内容更改重新加载特定单元格。

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

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

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

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

看看这个答案: 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 

要禁用烦人的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)

您可以仅通过实施以下方法来调整单元格高度

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM