我有一个不同项目高度的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版本相比很慢。
有什么建议吗?
答案 0 :(得分:2)
嗯,你可以在向下滚动后重新加载可见的单元格....
[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows]
withRowAnimation:UITableViewRowAnimationNone];
答案 1 :(得分:0)
我们最终更好地实施了estimatedHeightForRowAtIndexPath
。
在那里,我们通过一些简单的计算计算出前50个项目的更好的估计高度,因此我们得到非常接近真实高度的值。
对于其他项目,我们从第一次计算中返回平均值。
答案 2 :(得分:-1)
由于您知道要滚动到底部,因此可以使用
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
然后,您不需要计算单元格高度并添加节页眉和页脚的高度。