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

Posted

技术标签:

【中文标题】何时何地根据实际宽度更新 UITableViewCell 子视图的约束【英文标题】:When and where to update UITableViewCell subview's constraints based on actual widths 【发布时间】:2017-06-30 13:35:34 【问题描述】:

我有一个UITableView,他的单元格高度是根据自动布局自动生成的。一切都很好,直到我添加一个高度会根据渲染单元格的最终宽度以自定义方式变化的子视图。

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

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

在不同的地方强制 setNeedsLayoutlayoutIfNeeded 并不能解决这个问题。

有趣的是,这是其中一种情况,当滚动时高度开始自我校正,最终所有单元格的高度都正确。似乎在第一次加载表格视图时情况非常糟糕。

【问题讨论】:

查看次数对高度有何影响?您是否可能在宽屏上显示一排视图,在窄屏上显示两排? 但是单元格的宽度在 UITableView 中永远不会改变。你最好做的是使用具有固定布局的两个单元格(和两个重用标识符)。然后将逻辑移到cellForRow 方法中,并将正确的单元格类型出列。 @DonMag 我正在展示一系列完全适合单元格宽度的缩略图。鉴于它们的固定纵横比,可见视图的数量会影响该行的高度。 @Fogmeister 它们可以根据旋转进行更改,并且 iPad 支持分屏等各种宽度。鉴于它需要支持 iPhone 5 和 plus 设备,它需要支持的宽度很多,因此需要动态计算而不是硬编码。 @Sencha 啊,是的,你是对的。那么,您更改布局的逻辑是什么?将代码放入问题中。 【参考方案1】:

我在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)

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

【讨论】:

以上是关于何时何地根据实际宽度更新 UITableViewCell 子视图的约束的主要内容,如果未能解决你的问题,请参考以下文章

分裂何时何地发生?

何时何地使用 JMS?

BaseHTTPServer 和 SimpleHTTPServer 有啥区别?何时何地使用它们?

Twig 渲染与包含 - 何时何地使用其中一个?

NHibernate ISession Flush:何时何地使用它,为啥?

SQL 中何时何地使用单引号? [复制]