swift2 UITableViewCell高度是否独立?

k2arahey  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(194)

我在这里找到的所有实现都需要表格视图委托来处理每个高度。有没有办法让每个单元格告诉表格视图委托它们的高度是多少?
我已经尝试了以下实现,但没有雪茄
自定义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()

xdnvmnnf

xdnvmnnf1#

有不同的方法来实现你想做的事情:

使用自动布局的动态单元格大小

这将是最好的方法,因为UITableView将自己计算单元格高度,而无需您做任何事情(除了使用Auto Layout布局单元格)。缺点:这只在iOS 8和更高版本中可用,所以如果您仍然必须支持比iOS 8更旧的iOS版本,您不能使用此功能。

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

这是在动态单元格大小可用之前的老方法。正如你已经提到的,不可能要求实际单元格的高度,因为UITableView需要知道单元格的高度,然后才能在屏幕上绘制它。
您可以创建仅用于高度计算的引用单元格。这些单元格可以使用示例中的高度计算方法,但它们必须在不显示的情况下计算高度。这听起来有点奇怪,但您可能正在设置单元格的子视图框架,因此从子视图框架计算单元格的高度应该很容易。因此,您需要做的是:
1.在每个单元格类中创建一个getHeight(forCellWidth cellWidth: CGFloat, cellData: AnyObject) -> CGFloat方法。您需要将width作为参数传递,因为您必须在不实际绘制单元格的情况下计算单元格的高度。为此,单元格必须知道它的宽度。您还必须传递应该显示的数据,以便单元格可以计算它所需要的高度。
1.在你的UI(Table)ViewController中为每种类型创建一个单元格,并保留对它的引用。这些单元格将只用于高度计算。它们不会被显示,并且你只需要为每个类创建一个单元格。
1.在heightForRowAtIndexPath中,您确定该行必须使用哪种单元格类型。然后对该类型的引用单元格调用getHeight::以获取高度。您必须将单元格宽度和单元格数据传递给该方法。
1.根据单元格布局的复杂性,您可能需要考虑缓存单元格高度,以便每行只进行一次计算,而不是在用户每次上下滚动时进行计算。
这只是一个关于如何使它工作的基本描述。看看这个tutorial,它更详细地描述了这个方法。它只使用了一个单元格类,但我相信你可以修改它来满足你的需要。

相关问题