2

我正在尝试根据一些动态内容设置 UITableViewCell 的高度。我知道您可以通过视图控制器中的 heightForRowAtIndexPath 委托方法“设置”高度,但是……我不能这样做!

问题是在调用 cellForRowAtIndexPath 之前不知道单元格的高度,并且在调用cellForRowAtIndexPath之前调用 heightForRowAtIndexPath 。

因此,我需要以某种方式颠倒调用这两种方法的顺序,或者找到另一种设置单元格高度的方法。

有任何想法吗?

4

1 回答 1

0

抱歉 - 没有内置方法可以反转这些方法或类似方法。原因之一是表格视图可能出于多种原因想要知道行的高度,并非所有原因都包括显示单元格 --tableView:heightForRowAtIndexPath:可能会被多次调用,或者-tableView:cellForRowAtIndexPath:在调用高度法。

可以做的是找到另一种方法来提前计算适当的高度,将其缓存,并依赖于-tableView:heightForRowAtIndexPath:. 我已经设法通过构建一个“虚拟” UITableViewCell 实例来做类似的事情,将其排除在正常的重用队列之外,并将其仅用于布局和高度确定目的。这样的解决方案将是这样的:

  1. 得到-tableView:heightForRowAtIndexPath:
  2. 在高度缓存中查找索引路径。如果你有一个值,返回它。
  3. 否则,请使用您的虚拟单元格来布置将出现在该索引路径上的内容。测量单元格的高度并将其缓存。
  4. 可能会重复步骤 1-3 几次,具体取决于-tableView:heightForRowAtIndexPath:调用的次数。
  5. 得到-tableView:cellForRowAtIndexPath:
  6. 从正常的重用队列中取出一个单元格,填充它,布置它,然后返回它。(您可以选择验证其高度是否与您预先计算的高度相匹配,以便表格视图的行为符合您的预期。)

根据您的单元格内容和用例中“lay it out”短语的复杂性,当您计算前几个高度或用户快速滚动表格视图时,这可能会导致合理的性能损失。但是,随着您的缓存升温,随着应用程序继续运行,您应该计算越来越少的高度。

最后一点:请记住,对于具有默认高度的单元格(可能会或可能不会出现在您的表格中),您可以通过返回提前退出tableView.rowHeight,而不是每次出现时都计算默认高度。这可以在一定程度上减轻上述方法的计算负担。

于 2013-01-17T23:16:42.310 回答