在动态高度单元格 table 中,自动布局改变了屏幕上已经显示的单元格的高度?

Have autolayout CHANGE the height of a cell, already on screen, in a dynamic height cell table?

幸运的是,如今拥有一个 iOS table 是微不足道的,其中每个单元格都有一个动态高度。所以在单元格垂直约束..

---- top of content view
- vertical constraint to
-- UILabel, with, .lines set to zero
- vertical constraint to
---- bottom of content view

假设UILabel文本变化很大,1个字,20个字,100个字,

在table组

    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 200 // say

大功告成,现在它 完美地工作 当然。

但是,我遇到了常见的情况,您加载 table,想象一下十个单元格。

我用“正在加载...”填充 UILabel

只有到那时——比如说,一两秒后——我们才能获得文本内容的信息。它在一秒钟后到达,单元格将文本更改为“一些长文本 .. 有很多行”。

事实上,我很惊讶地得知 UITableView 似乎不处理这个。有问题的单元格 卡在原来的短高度

因此,在设置了较大的文本后,我尝试了通常的所有排列:

        maintext.sizeToFit()
        
        contentView.layoutSubviews()
        contentView.layoutIfNeeded()

在单元格上,不起作用。

我尝试将 setNeedsLayout and/or layoutIfNeeded 发送到 table 本身,但不起作用。

我考虑过 table 本身上的 .reloadData(),但是-哦-这会再次触发从服务器提取并再次加载的内容,所以这并不理想。

请注意:

  1. 显然,对于特定示例有许多解决方法,例如不使用动态数据

  2. 我完全知道如何手动设置一个单元格的高度动画(比如当用户点击时“展开”一个单元格以显示其他内容)

这个问题是关于自动布局和 table 视图的——感谢 Apple,如今它可以完美地处理涉及 UILabel 的完全动态单元格高度,其中行为零。

但是如果这样的标签中的文本发生变化怎么办?

table 视图系统似乎无法处理此问题。

一定有办法吗?

当单元格的内容更改布局(在本例中为高度)时,您必须通知table 查看布局已更改。

这通常通过以下任一方式完成:

tableView.beginUpdates()
tableView.endUpdates()

或:

tableView.performBatchUpdates(_:completion:)

为什么没有自动触发?

我想这可能是为了允许您制作自己的动画,或者您可能想延迟更新,或者其他一些暂时没有想到的原因。

或者,可能是为了保持向后兼容性?

我不知道。我想苹果可以告诉我们...