我有一个动态大小的单元格的tableview,以及一个切换这些单元格的排序顺序的按钮。我想在每次切换排序顺序时滚动到顶部,但是当我将内容偏移设置为顶部时,它似乎只滚动了~90%的方式。
抵消代码很简单,并且在不同的项目中很好地帮助了我,所以我非常怀疑问题在这里:
- (void) scrollToTop
{
CGPoint offset = CGPointMake(0, -self.tableView.contentInset.top);
[self.tableView setContentOffset:offset animated:YES];
}
答案 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];