独立的UITableViewCell高度?

时间:2015-12-25 01:08:53

标签: swift uitableview swift2

我在这里找到的所有实现都需要表视图委托来处理每个高度。有没有办法让每个单元格告诉表格视图委托他们的高度是什么?

我尝试了以下实施,没有雪茄

自定义UITableViewCell

import UIKit

class TETableViewCell: UITableViewCell {

    //...

    func calculateHeight() -> CGFloat {
        return CGRectGetHeight(labelCaption.frame)
    }

    //...

}

表视图委托类

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! TETableViewCell
    return cell.calculateHeight()
}

我知道这会导致无休止的循环循环。解决问题的正确方法是什么?

请注意,TETableViewCell是我所有自定义单元格的基类,因此我会针对不同的方案覆盖calculateHeight()

1 个答案:

答案 0 :(得分:1)

如何实现您的目标,有不同的方法:

使用自动布局

的动态单元格大小

这将是最好的方法,因为UITableView可以自己计算出单元格高度而无需做任何事情(除了使用自动布局布局单元格)。缺点:这仅适用于iOS8及更高版本,因此如果您仍然需要支持iOS8之前的iOS版本,则无法使用此版本。

使用参考/原型单元格确定单元格高度

在动态细胞大小可用之前,这是旧学校的方法。正如您已经提到的那样,不可能向实际单元格询问它们的高度,因为UITableView需要知道单元格的高度才能在屏幕上绘制它。

您可以做的是创建参考单元格,仅用于高度计算。单元格可以具有示例中的高度计算方法,但是它们必须在不显示的情况下计算其高度。这听起来有点奇怪,但你可能正在设置细胞的框架'无论如何都要进行子视图,因此从子视图框架中计算单元格的高度应该很容易。所以你需要做的是:

  1. 在每个单元类中创建getHeight(forCellWidth cellWidth: CGFloat, cellData: AnyObject) -> CGFloat方法。您需要将width作为参数传递,因为您必须在不实际绘制单元格的情况下计算单元格的高度。为此,细胞必须知道它有多宽。您还必须传递应显示的数据,以便单元格可以计算出所需的高度。

  2. 在您的UI(表格)中,ViewController为每种类型创建一个单元格并保留对它的引用。这些单元格仅用于高度计算。他们不会被展示,每个班级你只需要1个。

  3. heightForRowAtIndexPath中,您确定必须为该行使用哪种单元格类型。然后在该类型的参考单元格上调用getHeight::以获取高度。您必须将单元格宽度和单元格数据传递给该方法。

  4. 根据单元格布局的复杂程度,您可能需要考虑缓存单元格高度,以便每行只进行一次计算,而不是每次用户向上和向下滚动。

  5. 这只是如何使其发挥作用的基本描述。查看此tutorial,其中更详细地介绍了此方法。它只使用一个细胞类,但我相信你可以根据自己的需要调整它。