自下而上的UITableView以不同的项目高度滚动结束

我有一个UITableView具有不同的项目高度。 在开始时,用户应该看到最后的项目(在列表的末尾),并且应该能够手动滚动到顶部。

要在后台进程调用[tableView reloadData]之后,在主线程上使用[tableView scrollToRowAtIndexPath:lastIndexPath atScrollPositionBottom animated:NO]列表的最后。 为了加速并达到真正的目的,我使用estimatedHeightForRowAtIndexPath并返回前8项(CGFloat)500和其他项(CGFloat)100 。 使用estimatedHeightForRowAtIndexPath可避免为列表中的每个项目调用heightForRowAtIndexPath (它可能是一个很长的列表)。

使用iOS 8(iPhone 4S,5S,6)一切正常,但与iOS 7(iPhone 4S)只是heightForRowAtIndexPath被调用,但不cellForRowAtIndexPath ,所以没有项目显示,直到我开始滚动。 为每个estimatedHeightForRowAtIndexPath调用返回(CGFloat)100可以避免这种情况,但是它不会滚动到列表的实际末尾,并且与iOS 8 iPhone 4S版本比较,这非常缓慢。

有什么build议么?

那么你可以简单地重新加载可见的单元格后,向下滚动….

 [tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; 

我们结束了一个更好的estimatedHeightForRowAtIndexPath HeightForRowAtIndexPath的实现。 在那里我们用一些简单的计算来计算前50个项目的更好的估计高度,所以我们得到的值非常接近真实的高度。 对于其他项目,我们返回第一次计算的平均值。

既然你知道你想滚动到底部,你可以使用

 - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; 

然后,您不需要计算单元格高度并添加节头和页脚的高度。