在动态高度单元格 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(),但是-哦-这会再次触发从服务器提取并再次加载的内容,所以这并不理想。
请注意:
显然,对于特定示例有许多解决方法,例如不使用动态数据
我完全知道如何手动设置一个单元格的高度动画(比如当用户点击时“展开”一个单元格以显示其他内容)
这个问题是关于自动布局和 table 视图的——感谢 Apple,如今它可以完美地处理涉及 UILabel 的完全动态单元格高度,其中行为零。
但是如果这样的标签中的文本发生变化怎么办?
table 视图系统似乎无法处理此问题。
一定有办法吗?
当单元格的内容更改布局(在本例中为高度)时,您必须通知table 查看布局已更改。
这通常通过以下任一方式完成:
tableView.beginUpdates()
tableView.endUpdates()
或:
tableView.performBatchUpdates(_:completion:)
为什么没有自动触发?
我想这可能是为了允许您制作自己的动画,或者您可能想延迟更新,或者其他一些暂时没有想到的原因。
或者,可能是为了保持向后兼容性?
我不知道。我想苹果可以告诉我们...
幸运的是,如今拥有一个 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(),但是-哦-这会再次触发从服务器提取并再次加载的内容,所以这并不理想。
请注意:
显然,对于特定示例有许多解决方法,例如不使用动态数据
我完全知道如何手动设置一个单元格的高度动画(比如当用户点击时“展开”一个单元格以显示其他内容)
这个问题是关于自动布局和 table 视图的——感谢 Apple,如今它可以完美地处理涉及 UILabel 的完全动态单元格高度,其中行为零。
但是如果这样的标签中的文本发生变化怎么办?
table 视图系统似乎无法处理此问题。
一定有办法吗?
当单元格的内容更改布局(在本例中为高度)时,您必须通知table 查看布局已更改。
这通常通过以下任一方式完成:
tableView.beginUpdates()
tableView.endUpdates()
或:
tableView.performBatchUpdates(_:completion:)
为什么没有自动触发?
我想这可能是为了允许您制作自己的动画,或者您可能想延迟更新,或者其他一些暂时没有想到的原因。
或者,可能是为了保持向后兼容性?
我不知道。我想苹果可以告诉我们...