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

Fat*_*tie 11 uitableview ios heightforrowatindexpath ios7

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

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

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

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

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

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

{注意 - 当然iOS最终会调​​整单元格的高度,而不是"我".}

这一切都完美无缺.

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

现在,我添加代码......

-(CGFloat)tableView:(UITableView *)tableView
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 120;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我认为它可能会做这样的事情:说你的estimatedHeightForRowAtIndexPath值是150.它有时使用150来表示(事实上()实际上是大小或更小的行,但有时它会从heightForRowAtIndexPath获得实际大小.

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

非常高的细胞似乎正常工作,也许类似"如果从heightForRowAtIndexPath的高度是估计的两倍,那么它确实使用真正的高度"

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

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

Tim*_*ose 18

更新的答案

经过进一步调查后,事实证明"它只需要自动布局"是不正确的.这是我的示例代码,需要自动布局.我做了一些修改DynamicHeightCell,它现在可以使用或不使用自动布局.

原始答案

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

这是一个工作项目,演示tableView:estimatedHeightForRowAtIndexPath:如何正确使用自动布局.如果在故事板中关闭"自动布局",则其行为与您所描述的相同.

估计的行高演示