IOS 8 UITableView自动resize的单元格在新视图控制器被按下时跳转/移动

这是我如何设置我的表格:

self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; self.tableView.delegate = self; self.tableView.dataSource = self; self.tableView.estimatedRowHeight = 150; [self.view addSubview:self.tableView]; 

在我的单元格内,我调用- (CGSize)sizeThatFits:(CGSize)size以编程方式返回高度(这是设置在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 。使用约束或自动布局。

没有什么复杂的,我的身高都完美的视觉。

然而,问题是当我推新视图控制器,单元格跳转/视觉(向上或向下)。 它似乎是基于计算估计的行高度跳跃 – 然而sizeThatFits也是每个可见的单元格在移动之前调用,所以我真的很困惑(不知道为什么要么真的需要被调用,因为我离开了视图)。 我检查了tableView的contentOffset – 它没有改变,所以这不是问题。

好的,我通过在sizeThatFits中caching我的单元格高度来解决这个问题,并在代理内返回估计单元高度的值。 精美的作品。

快速解决:

 override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) self.tableView.reloadData() } 

编辑:在这个和类似的问题上花了几个小时后,我发现最好的解决scheme是caching单元格高度,并在estimatedHeightForRowAtIndexPath委托方法中返回它们,问题是由估计的高度是不准确的。

我将tableView(_:willDisplayCell:forRowAtIndexPath :)中的高度caching到字典中,数据被添加或更新时,这些数据的唯一ID就是这样的键值。我可以从caching中移除该高度,只使用更好的估计高度该单元使用估计的高度。 到目前为止,这解决了我所有的跳跃和滚动问题。