【问题标题】:Set UITableViewCell height *without* using heightForRowAtIndexPath使用 heightForRowAtIndexPath 设置 UITableViewCell 高度 *without*
【发布时间】:2013-01-01 14:55:48
【问题描述】:

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

问题是单元格的高度直到 cellForRowAtIndexPath 被调用才知道,而 heightForRowAtIndexPath 被调用之前 cellForRowAtIndexPath。

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

有什么想法吗?

【问题讨论】:

  • 要么您必须计算viewDidLoad 中的高度并将其添加到数组中并使用它,要么在heightForRowAtIndexPath 方法中进行计算。您不能颠倒顺序。
  • 无论您在 cellForRowAtIndexPath 中进行什么计算来获取高度,为什么不能在 heightForRowAtIndexPath 中进行同样的计算?
  • @ACB 是对的(和往常一样!)。你必须这样做。您需要重新考虑如何或何时计算行高 - 它应该基于您的模型,在您开始描述表格视图之前应该知道这一点。 为什么不能按正常顺序做呢?
  • @jrturton,谢谢你的好话。

标签: ios uitableview height


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2014-07-05
    • 2017-01-20
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2020-08-29
    • 2013-12-26
    相关资源
    最近更新 更多