自下而上的UITableView具有不同的项目高度滚动到结尾

时间:2014-11-20 16:01:50

标签: ios objective-c iphone uitableview ios7

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

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

嗯,你可以在向下滚动后重新加载可见的单元格....

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

答案 1 :(得分:0)

我们最终更好地实施了estimatedHeightForRowAtIndexPath。 在那里,我们通过一些简单的计算计算出前50个项目的更好的估计高度,因此我们得到非常接近真实高度的值。 对于其他项目,我们从第一次计算中返回平均值。

答案 2 :(得分:-1)

由于您知道要滚动到底部,因此可以使用

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

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