gpt4 book ai didi

iphone - UITableView 灵活/动态 heightForRowAtIndexPath

转载 作者:行者123 更新时间:2023-12-03 18:10:05 28 4
gpt4 key购买 nike

案例

通常,您会使用 cellForRowAtIndexPath 委托(delegate)方法来设置单元格。单元格的信息集对于单元格的绘制方式和大小非常重要。

不幸的是,heightForRowAtIndexPath 委托(delegate)方法在 cellForRowAtIndexPath 委托(delegate)方法之前调用,因此我们不能简单地告诉委托(delegate)返回单元格的高度,因为这将是那时为零。

所以我们需要在表格中绘制单元格之前计算其大小。幸运的是,有一个方法可以做到这一点,sizeWithFont,它属于 NSString 类。然而存在问题,为了动态计算正确的大小,它需要知道单元格中的元素将如何呈现。我将通过一个例子来阐明这一点:

想象一个 UITableViewCell,其中包含一个名为 textLabel 的标签。在 cellForRowAtIndexPath 委托(delegate)方法中,我们放置 textLabel.numberOfLines = 0,它基本上告诉标签它可以有尽可能多的行来呈现特定宽度的文本。如果我们为 textLabel 指定的文本大于最初指定给 textLabel 的宽度,就会出现问题。第二行将会出现,但单元格的高度不会自动调整,因此我们会得到一个看起来很困惑的表格 View 。

如前所述,我们可以使用 sizeWithFont 来计算高度,但它需要知道使用哪种 Font、宽度等。如果为了简单起见,我们只关心width,我们可以硬编码宽度约为 320.0(不考虑填充)。但是,如果我们使用 UITableViewStyleGrouped 而不是普通的,会发生什么,宽度将在 300.0 左右,单元格将再次困惑。或者如果我们从纵向切换到横向会发生什么,我们有更多的空间,但由于我们硬编码了 300.0,所以不会使用它。

在这种情况下,在某些时候您必须问自己这样的问题:您可以在多大程度上避免硬编码。

我自己的想法

您可以调用属于 UITableView 类的 cellForRowAtIndexPath 方法来获取特定部分和行的单元格。我读过几篇文章说你不想这样做,但我不太明白。是的,我同意它已经分配了单元格,但是仅对可见的单元格调用 heightForRowAtIndexPath 委托(delegate)方法,因此无论如何都会分配单元格。如果正确使用 dequeueReusableCellWithIdentifier,单元格将不会在 cellForRowAtIndexPath 方法中再次分配,而是使用指针并仅调整属性。那么问题出在哪里呢?

请注意,单元格不是在 cellForRowAtIndexPath 委托(delegate)方法中绘制的,当 TableView 单元格变得可见时,脚本将调用 UITableVieCell 上的 setNeedDisplay 方法,该方法会触发drawRect 方法来绘制单元格。因此直接调用 cellForRowAtIndexPath 委托(delegate)不会损失性能,因为它需要绘制两次。

好吧,通过在 heightForRowAtIndexPath 委托(delegate)方法中调用 cellForRowAtIndexPath 委托(delegate)方法,我们可以收到有关单元格的所有信息,以确定其大小。

也许您可以创建自己的 sizeForCell 方法来运行所有选项,如果单元格采用 Value1 样式或 Value2 等样式该怎么办?

结论/问题

这只是我在想法中描述的一个理论,我想知道我写的是否正确。或者也许还有另一种方法可以完成同样的事情。请注意,我希望能够尽可能灵活地做事情。

最佳答案

Yes, I agree it will already allocate the cell, but the heightForRowAtIndexPath delegate method is only called for the cells that will be visible so the cell will be allocated anyway.

这是不正确的。 TableView 需要为 TableView 中的所有行调用 heightForRowAtIndexPath (如果已实现),而不仅仅是当前显示的行。原因是它需要计算出其总高度才能显示正确的滚动指示器。

关于iphone - UITableView 灵活/动态 heightForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com