11

在使用estimatedHeightForRowAtIndexPath 时,我刚刚发现了一个令人震惊的问题或违反直觉的行为

(1) 我的桌子的行高变化很大。最终结果的范围可以从 111 到大约 400。

(2) 我绝对完美地计算了每一行的高度。我手头有这些数组,也就是说缓存。

{请注意,这正是 Apple 工程师现在推荐的……例如,第 5 点 ..在 UITableView 中使用自动布局进行动态单元格布局和可变行高}

(3) 当 heightForRowAtIndexPath 要求一个高度时,我确实给它绝对正确的高度。

(4) 实际上,当我构建单元时,我会将其构建到完全正确的高度(如 (2) 和 (3) 中所示)。

{注意——当然是 iOS 最终决定了单元格的高度,而不是“我”。}

这一切都很完美。

即,每个单元格都是由 iOS 在 heightForRowAtIndexPath 中给定的高度构建的。

现在,我添加代码...

-(CGFloat)tableView:(UITableView *)tableView
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 120;
}

事实上,桌子不再工作............行高变得随机!

有人见过这种不可思议的行为吗?

我做了各种测试,试图确定这到底是什么的估计HeightForRowAtIndexPath 的关系。起初,我认为它可能会提供高度的下限。因此,150 .. 甚至我较小的单元格也会错误地为 150 高度。但事实并非如此。

我认为它可能会做这样的事情:假设您的估计HeightForRowAtIndexPath 值为 150。有时它使用 150 来表示行(实际上()证明是该大小或更小,但有时它适用于 heightForRowAtIndexPath 的实际大小。

另一方面,如果你输入一个比实际存在的值更小的estimatedHeightForRowAtIndexPath 值(在我的例子中说100),它几乎“完全不起作用”,你只会得到看起来只能是随机高度的值细胞。

非常高的单元格似乎可以正常工作,可能类似于“如果 heightForRowAtIndexPath 的高度是估计值的两倍,那么它确实使用实际高度”

需要明确的是,它似乎永远不会使细胞变得太小,但它经常使它们变得太大。

需要明确的是,我没有使用自动布局,它是您必须构建的单元格类型。(恐怕我不知道这与自动布局有什么关系。)这只是 Xcode5/iOS7+。

4

2 回答 2

18

更新的答案

经过进一步调查,事实证明“它只需要自动布局”是不正确的。我的示例代码需要自动布局。我做了一点修改,DynamicHeightCell现在不管有没有自动布局都可以工作。

原始答案

它只需要自动布局。这并不奇怪,真的,但绝对应该记录在案。

这是一个演示tableView:estimatedHeightForRowAtIndexPath:如何正确使用自动布局的工作项目。如果您在情节提要中关闭自动布局,它的行为就像您所描述的那样。

估计行高演示

于 2013-12-05T17:00:38.880 回答
1
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { }

当您有大量动态单元格时,通常使用此委托方法,它提供了单元格的粗略估计。

例如:如果您有 100 个单元格,每个单元格的高度范围从 200 到 300(例如 201、207、250、299、300...),您可以估计单元格高度约为 250。即

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 250;
}
  • 在加载表格视图时,提供行高估计可以改善用户体验。
  • 如果未实现此委托,则计算其所有高度可能会很昂贵,因此会导致更长的加载时间。
于 2015-05-20T08:36:09.660 回答