44

在 IOS6 我有以下代码滚动到 UITableView 的顶部

[tableView setContentOffset:CGPointZero animated:YES];

在 IOS7 中,这不再起作用。表格视图没有完全滚动到顶部(但几乎)。

4

12 回答 12

127

在 iOS7 中,全屏 UITableView 和 UIScrollView 组件默认调整内容和滚动指示器的插入,以使一切正常。但是,正如您所注意到的,CGPointZero 不再代表将您带到视觉“顶部”的内容偏移量。

改用这个:

self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top);

在这里,您不必担心是否有部分或行。您也没有告诉表格视图以第一行为目标,然后想知道为什么它没有显示所有非常高的表格标题视图等。

于 2013-11-15T22:24:47.750 回答
23

试试这个:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
于 2013-10-08T08:55:47.480 回答
22

根据@Markus Johansson 接受的答案,这里是 Swift 代码版本:

func scrollToTop() {
    if (self.tableView.numberOfSections > 0 ) {
        let top = NSIndexPath(row: Foundation.NSNotFound, section: 0)
        self.tableView.scrollToRow(at: top as IndexPath, at: .top, animated: true);
    }
}
于 2014-08-01T13:01:02.317 回答
17

在此处其他一些答案的帮助下,我设法使其正常工作。为了避免崩溃,我必须首先检查是否有一些部分。如果第一部分没有行,则 NsNotFound 可以用作行索引。希望这应该是放置在 UITableViewController 中的通用函数:

-(void) scrollToTop
{
    if ([self numberOfSectionsInTableView:self.tableView] > 0)
    {
        NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
        [self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
}
于 2013-10-08T09:22:57.803 回答
4
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.sampleTableView.scrollToRowAtIndexPath(indexPath,
atScrollPosition: UITableViewScrollPosition.Top, animated: true)

或者

self.sampleTableView.setContentOffset(CGPoint.zero, animated:false)
于 2015-09-24T14:32:06.707 回答
3
float systemVersion= [[[UIDevice currentDevice] systemVersion] floatValue];

if(systemVersion >= 7.0f)
{
  self.edgesForExtendedLayout=UIRectEdgeNone;   
}

viewDidLoad()在方法中尝试此代码。

于 2013-10-08T08:54:15.337 回答
3

这是 idStar在更新的 Swift 3 语法中的答案:

self.tableView.contentOffset = CGPoint(x: 0, y: 0 - self.tableView.contentInset.top)

带动画:

self.tableView.setContentOffset(CGPoint(x: 0, y: 0 - self.tableView.contentInset.top), animated: true)
于 2016-10-14T21:49:46.103 回答
3

斯威夫特 3

如果您有表格视图标题 CGPointZero 可能不适合您,但这总是可以滚动到顶部。

self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
于 2016-10-22T05:41:28.597 回答
2

您仍然可以scrollToRowAtIndexPath:用于此目的

于 2013-10-08T08:55:34.493 回答
2

我意识到这已得到解答,但我只想提供另一种选择:

CGRect frame = {{0, 0},{1, 1}};
[self.tableView scrollRectToVisible:frame animated:YES];

这始终保证 UITableView 将滚动到顶部。接受的答案:

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

对我不起作用,因为我滚动到 tableHeaderView 而不是单元格。

scrollRectToVisible在 iOS 6 和 7 上使用。

于 2014-06-18T17:31:25.440 回答
1

Swift 4 UITableViewExtension:

func scrollToTop(animated: Bool) {
    if numberOfSections > 0 {
        let topIndexPath = IndexPath(row: NSNotFound, section: 0)
        scrollToRow(at: topIndexPath, at: .top, animated: animated)
    }
}
于 2017-09-22T09:37:23.857 回答
0

我迅速使用了:

self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)

但是@Alvin George 的作品很棒

于 2016-04-13T09:24:08.827 回答