使用heightForRowAtIndexPath设置UITableViewCell高度*而不使用*

时间:2013-01-17 23:02:01

标签: ios uitableview height

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

抱歉 - 没有内置的方法来反转这些方法或类似的东西。其中一个原因是表视图可能由于多种原因想要知道行的高度,并非所有原因都包括显示单元格 - -tableView:heightForRowAtIndexPath:可能会多次调用,或-tableView:cellForRowAtIndexPath:在调用高度方法后,可能根本不会调用它。

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

  1. 获取-tableView:heightForRowAtIndexPath:
  2. 在高速缓存中查找索引路径。如果您有值,请将其退回。
  3. 否则,使用虚拟单元格布置将出现在索引路径中的内容。测量单元格的高度并缓存它。
  4. 根据调用-tableView:heightForRowAtIndexPath:的数量,可能会多次重复步骤1-3。
  5. 获取-tableView:cellForRowAtIndexPath:
  6. 从正常重用队列中取出一个单元格,填充它,将其布局并返回。 (您可以选择验证其高度是否与预先计算的高度相匹配,以便表格视图的行为符合您的预期。)
  7. 根据您的单元格的内容以及您在用例中使用“lay It out”短语的复杂程度,这可能会在您计算前几个高度时产生合理的性能影响,或者当您的用户快速滚动表格视图时。但是,随着缓存的升温,随着应用程序继续运行,您应该计算越来越少的高度。

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