UITableView – 滚动到顶部

在我的表格视图中,我必须滚动到顶部。 但是我不能保证第一个对象是第0行,第0行。可能是我的表视图将从第5节开始。

所以当我打电话的时候,我得到了一个exception:

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

是否有另一种方式滚动到表视图的顶部?

UITableView是UIScrollView的一个子类,所以你也可以使用:

 [mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 

要么

 [mainTableView setContentOffset:CGPointZero animated:YES]; 

而在Swift中:

 mainTableView.setContentOffset(CGPointZero, animated:true) 

而在Swift 3:

 mainTableView.setContentOffset(CGPoint.zero, animated: true) 

我更喜欢

 [mainTableView setContentOffset:CGPointZero animated:YES]; 

如果你的表格视图有一个顶部插入,你必须减去它:

 [mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES]; 

可能的行动:

1

 func scrollToFirstRow() { let indexPath = NSIndexPath(forRow: 0, inSection: 0) self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true) } 

2

 func scrollToLastRow() { let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0) self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true) } 

3

 func scrollToSelectedRow() { let selectedRows = self.tableView.indexPathsForSelectedRows if let selectedRow = selectedRows?[0] as? NSIndexPath { self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true) } } 

4

 func scrollToHeader() { self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true) } 

 func scrollToTop(){ self.tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true) } 

禁用滚动到顶部:

 func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) { for subview in view.subviews { if let scrollView = subview as? UIScrollView { (scrollView as UIScrollView).scrollsToTop = false } self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView) } } 

根据需要修改和使用它。

斯威夫特4

  func scrollToFirstRow() { let indexPath = IndexPath(row: 0, section: 0) self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) } 

最好不要使用NSIndexPath(空表),也不要假设顶点是CGPointZero(内容插入),这就是我使用的 –

 [tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES]; 

希望这可以帮助。

对于具有contentInset表格,将内容偏移量设置为CGPointZero将不起作用。 它将滚动到内容顶部与滚动到桌面。

考虑到内容插入产生这个:

 [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO]; 

这个代码让你滚动一个特定的部分到顶部

 CGRect cellRect = [tableinstance rectForSection:section]; CGPoint origin = [tableinstacne convertPoint:cellRect.origin fromView:<tableistance>]; [tableinstance setContentOffset:CGPointMake(0, origin.y)]; 

迅速:

 tableView.setContentOffset(CGPointZero, animated: true) 

再加上已经说过的话,你可以创build一个扩展(Swift)或类别(Objective C),以便将来更容易:

迅速:

 extension UITableView { func scrollToTop(animated: Bool) { setContentOffset(CGPointZero, animated: animated) } } 

任何时候你想要将任何给定的tableView滚动到顶部,你可以调用下面的代码:

 tableView.scrollToTop(animated: true) 

Swift:

如果你没有tableView标题:

 tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true) 

如果是这样 :

 tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height + UIApplication.sharedApplication().statusBarFrame.height ), animated: true) 

由于我的tableView充满了各种各样的insets,这是唯一运作良好的东西:

Swift 3

 if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 { tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) } 

Swift 2

 if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 { tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true) } 

我更喜欢以下内容,因为它考虑到了插图。 如果没有插入,它将仍然滚动到顶部,因为插入将是0。

 tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true) 

Swift 4

这很好:

 //self.tableView.reloadData() if you want to use this line remember to put it before let indexPath = IndexPath(row: 0, section: 0) self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) 

我必须添加乘以-1 *的状态栏和导航栏的总和,因为它是在屏幕上的高度,

 self.tableView.setContentOffset(CGPointMake(0 , -1 * (self.navigationController!.navigationBar.height + UIApplication.sharedApplication().statusBarFrame.height) ), animated:true) 

这里是代码ScrollTableView编程顶部

迅速:

 self.TableView.setContentOffset(CGPointMake(0, 1), animated:true) 

使用contentOffset不是正确的方法。 这将是更好的,因为它是表视图的自然方式

 tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true) 

以下是我在iOS 11上正常使用的内容:

 extension UIScrollView { func scrollToTop(animated: Bool) { var offset = contentOffset if #available(iOS 11, *) { offset.y = -adjustedContentInset.top } else { offset.y = -contentInset.top } setContentOffset(offset, animated: animated) } } 

我遇到了一个问题,在一个空的tableView上调用一些方法。 Swift 4的另一个选项是处理空的tableview。

 extension UITableView { func hasRowAtIndexPath(indexPath: IndexPath) -> Bool { return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section) } func scrollToTop() { let indexPath = IndexPath(row: 0, section: 0) if self.hasRowAtIndexPath(indexPath: indexPath) { self.scrollToRow(at: indexPath, at: .top, animated: true) } } } 

用法:

 // from yourViewController or yourTableViewController tableView.scrollToTop() 

如果你想在表中移动滚动animation,使用这个代码。 0.5秒内滚动移动到顶部。

 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; [_tableContent scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; [UIView commitAnimations]; 

迅速

你的行= selectioncellRowNumber你的部分,如果你有= selectionNumber如果你没有设置为零

//UITableViewScrollPosition.Middle或Bottom or Top

 var lastIndex = NSIndexPath(forRow: selectioncellRowNumber, inSection: selectionNumber) self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true) 
 func scrollToTop() { NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0]; [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES]; } 

调用这个函数,无论你想UITableView滚动到顶部

在Swift-3:

 self.tableView.setContentOffset(CGPoint.zero, animated: true) 

用Swift:

 self.scripSearchView.quickListTbl?.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true) 

要完成完成后,请添加此扩展名

 // MARK: - UIScrollView extension UIScrollView { /// Animate scroll to top with completion /// /// - Parameters: /// - duration: TimeInterval /// - completion: Completion block func animateScrollToTop(withDuration duration: TimeInterval, completion: @escaping (()->())) { UIView.animate(withDuration: duration, animations: { [weak self] in self?.setContentOffset(CGPoint.zero, animated: false) }, completion: { finish in guard finish else { return } completion() }) } } tableView.animateScrollToTop(withDuration: 0.25) { // Finish } 

在swift中使用这个代码来实现UITableview

 var cell = tableView.dequeueReusableCellWithIdentifier(“cell”) if cell == nil { cell = UITableViewCell(style: .Value1, reuseIdentifier: “cell”) } 

如果你不想滚动,你可以一开始就停止滚动animation。

  $('document').ready(function() { $("html, body").animate({ scrollTop: 0 }, 500); return true; }); 

此外,要为“x”和“y”设置放置值,传入0,0会将页面立即滚动到左上angular。

 window.scrollTo(x, y);