何时何地根据实际宽度更新UITableViewCell子视图的约束

时间:2017-06-30 13:35:34

标签: ios uitableview uikit ios-autolayout

我有UITableView根据自动布局自动调整单元格高度。一切都很有效,直到我添加一个子视图,其高度将根据渲染单元格的最终宽度以自定义方式变化。

简而言之,我需要显示自定义数字视图,可见数字取决于单元格的宽度,视图数量也会影响高度。

问题是我目前在相关子视图的layoutSubviews中进行计算和视图操作,但这会导致表格视图单元格的高度严重偏离。所以我相信我需要做计算和视图添加/删除足够早,所以autolayout可以计算正确的表格视图单元格高度,但足够晚,所以我实际上有正确的宽度,单元格将进行我的计算。

在各个地方强制setNeedsLayoutlayoutIfNeeded并不能解决此问题。

有趣的是,这是滚动高度开始自我校正并且最终所有细胞都是正确高度的情况之一。似乎是第一次加载表格视图时,情况非常糟糕。

1 个答案:

答案 0 :(得分:0)

我在layoutSubviews()的单元格中更改子视图的高度约束,并将其放在viewDidLoad()的末尾似乎在我的测试中运行良好:

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()
    tableView.reloadData()

如果您的设计允许,另一个选择是告诉表格重新计算其单元格高度:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tableView.beginUpdates()
    tableView.endUpdates()
}

假设您的“默认”是缩略图的“一行”,您会看到您的表格行展开以显示第二行。

或者,如果您不想看动画:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.setAnimationsEnabled(false)
    tableView.beginUpdates()
    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
}

但是,根据您的实际图形和设计,您可能会看到采用该方法的闪烁。