在使用动态大小单元格并将内容偏移设置为顶部之后,UITableView不会一直滚动到顶部

时间:2014-09-17 20:37:49

标签: ios cocoa-touch uitableview

我有一个动态大小的单元格的tableview,以及一个切换这些单元格的排序顺序的按钮。我想在每次切换排序顺序时滚动到顶部,但是当我将内容偏移设置为顶部时,它似乎只滚动了~90%的方式。

抵消代码很简单,并且在不同的项目中很好地帮助了我,所以我非常怀疑问题在这里:

- (void) scrollToTop
 {
    CGPoint offset = CGPointMake(0, -self.tableView.contentInset.top);
    [self.tableView setContentOffset:offset animated:YES];
}

3 个答案:

答案 0 :(得分:2)

没想到我会这么快就找到答案。

我正在使用UITableView' s tableView:estimatedHeightForRowAtIndexPath:来返回我的最小单元格高度,似乎tableview在reloadData内部使用它来创建内容在实际出列前有多大细胞和缓存高度。在内容中途并重新加载数据会导致tableview认为到顶部的距离是(当前可见*以上的单元格数量* estimatedHeightForRow的最小高度),导致tableview仅自动偏移为如果所有细胞都是最小高度。我的解决方案只是为了避免使用估计的高度,因为我的tableview无论如何都不会过长。如果你确实有一个大的tableview(接近1000多行),实际上需要使用估计的值出于性能原因,你可能想找到一种方法使估计值尽可能接近运行时值,或者查看更多详细解决方案

tl; dr - 删除tableView:estimatedHeightForRowAtIndexPath:并允许tableView从heightForRowAtIndexPath

开始调整大小

答案 1 :(得分:2)

    [self.tableView reloadData]; // Lets update with whatever info we have
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

为我重新加载然后滚动解决。

答案 2 :(得分:0)

这样的事情呢?

NSIndexPath *start = = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:start atScrollPosition:UITableViewScrollPositionTop animated:YES];