estimatedHeightForRowAtIndexPath实际上可以改变一行的最终“正确”高度吗?

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

(1)我的桌子行高度差异很大。 最终结果可以在111到约400之间。

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

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

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

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

{注意 – 当然iOS最终会调​​整单元格的高度,而不是“我”。}

这一切都完美无缺。

也就是说,每个单元格都是由iOS构建的,其高度恰好是heightForRowAtIndexPath中给出的高度。

现在,我添加代码……

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

事实上,表没有更长的工作………………行高成为随机!

有没有人看到这种令人难以置信的行为?

我做了各种各样的测试,试图确定地狱估计的高度锻炼指数的关系。 起初,我认为它可能提供高度的下限。 所以,150 ..甚至我的小细胞都会错误地达到150高度。 但事实并非如此。

我认为它可能会做这样的事情:说你的estimatedHeightForRowAtIndexPath值是150.它有时使用150行(实际上()实际上certificate是那个大小或更小,但有时它来自heightForRowAtIndexPath的实际大小。

另一方面,如果你为estimatedHeightForRowAtIndexPath设置了一个比实际存在的更小的值(比如我的例子中的100),它几乎“完全不起作用”你只能得到看似随机高度的东西细胞。

非常高的单元格似乎正常工作,也许类似“如果从heightForRowAtIndexPath的高度是估计的两倍,那么它确实使用真正的高度”

要清楚,它似乎从来没有使细胞太小,但它往往使它们太大。

要清楚,我没有使用autolayout,它只是你必须构建的单元格类型。 (我担心我不知道自动布局如何。)这只是Xcode5 / iOS7 +。

更新的答案

经过进一步调查后,结果显示“它只需要自动布局”不正确。 这是我的示例代码,需要自动布局。 我在DynamicHeightCell进行了一些修改,它现在可以使用或不使用Auto Layout。

原始答案

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

这是一个展示tableView:estimatedHeightForRowAtIndexPath:的工作项目tableView:estimatedHeightForRowAtIndexPath:与Auto Layout一起正常工作。 如果在故事板中关闭“自动布局”,则其行为与您所描述的相同。

估计的行高演示

 - (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; } 
  • 提供估计行的高度可以在加载表视图时改善用户体验。
  • 如果没有实施该代理,那么计算所有高度可能会很昂贵,从而导致更长的加载时间。