自动调整 UITableViewCell:更改自定义单元格内视图的高度

Posted

技术标签:

【中文标题】自动调整 UITableViewCell:更改自定义单元格内视图的高度【英文标题】:Autosizing UITableViewCell: change height of a view inside a custom cell 【发布时间】:2014-11-27 18:18:23 【问题描述】:

我搜索了很多解决方案,但找不到任何解决这个特殊情况的方法。

我在 UITableView 中创建了一个自定义单元格,这些元素按约束从顶部开始排列:

imageview(约束顶屏,固定宽度,固定高度,水平居中) top-label(约束顶部图像视图,固定宽度,水平居中)线设置为 0。 视图(约束顶部标签,固定宽度,水平居中)高度设置为0。 按钮(约束顶视图、固定宽度、固定高度、水平居中) bottom-label(约束顶视图、约束底部屏幕、固定宽度、固定高度、水平居中)

如果我为顶部标签插入很长的文本,单元格的高度也会正确自动调整。

现在我想在按钮上附加一个动作来启用视图高度的调整,就像手风琴一样。所以我试图改变高度但没有成功,如果我重新加载表格视图,任何东西都会改变。 我试图为视图的高度设置一个约束,但是如果我改变所有内容都会移动但单元格的高度不会改变。

我可以让视图改变高度的唯一方法是设置表格的行高,但这会改变表格的所有单元格,我只想打开一个单元格的视图。

还有其他方法吗?

提前致谢 麦芽酒

编辑:

为了清除问题,我使用 noobular 建议的委托方法解决了问题,将视图设置为 0 高度允许在单元格的高度发生变化时扩展。

【问题讨论】:

【参考方案1】:

我通过这些方法达到了类似的效果。首先,我确定一个代表单元格高度的约束。我正在使用左侧装饰条的高度约束,该装饰条固定在单元格的顶部和底部。重要的是,此约束属于作为单元格内容视图的子对象并且将在打开和关闭状态下都显示在屏幕上的对象。此约束连接到它将控制的单元格上的属性。

当我想改变单元格的高度时,即改为100,我可以这样做:

cell.heightConstraint.constant = 100.0
cell.layoutIfNeeded()
tableView.beginUpdates()
tableView.endUpdates()

对 beginUpdates 和 endUpdates 的调用会强制 tableView 重新布局其单元格,从而扩展或收缩单元格。请注意,我实际上是在单元格自己的setSelected:animated: 函数中调用前两行,而在表格视图控制器的tableView:didSelectCellAtIndexPath: 方法中调用其余两行。这具有在选中单元格时展开单元格的效果。

【讨论】:

非常感谢这个完美的答案!我只花了 2 个小时就找到了这个解决方案!【参考方案2】:

编辑:对于您希望 UIKit 自动计算高度的自动调整单元格大小,我建议研究 UITableViewAutomaticDimension

为您的 tableView 委托实现此方法: 表视图:heightForRowAtIndexPath:

【讨论】:

这可能是一个解决方案,但我认为在 ios8 中,使用单元格的自动调整大小,我可以避免这种方法并直接更改视图的高度以使单元格自动调整大小。 我认为您将自动布局误认为自动调整大小,这是两个不同的概念。表格视图的单元格不会调整大小,这就是 sdk 提供委托方法的原因。据我所知,iOS 8 还是一样的。 您应该接受答案,以便其他人知道这是解决此常见问题的潜在解决方案。 您不应该将 heightForRowAtIndexPath 用于自动调整单元格大小。

以上是关于自动调整 UITableViewCell:更改自定义单元格内视图的高度的主要内容,如果未能解决你的问题,请参考以下文章

当 UIStackView 更改其排列的子视图时,UITableViewCell 不会调整大小

TextField 子视图未通过 UITableViewCell 框架大小更改调整大小

在 UITableViewCell 中自动调整 UITextField 的大小

根据内容自动调整 UITableViewCell 高度

自动调整 UITableViewCell 大小:无法同时满足约束

如何让 UITableView 行高自动调整为 UITableViewCell 的大小?