在我的表视图中,我必须滚动到顶部.但我不能保证第一个对象将是第0部分,第0行.可能是我的表视图将从第5节开始.
所以当我打电话时,我得到一个例外:
[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];
在斯威夫特:
mainTableView.setContentOffset(CGPointZero, animated:true)
在Swift 3及以上版本中:
mainTableView.setContentOffset(.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];
希望这可以帮助.
斯威夫特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)
我遇到一个问题,调用一些空的方法tableView
.这是Swift 4处理空表视图的另一个选项.
extension UITableView { func hasRowAtIndexPath(indexPath: IndexPath) -> Bool { return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section) } func scrollToTop(animated: Bool) { let indexPath = IndexPath(row: 0, section: 0) if self.hasRowAtIndexPath(indexPath: indexPath) { self.scrollToRow(at: indexPath, at: .top, animated: animated) } } }
用法:
// from yourViewController or yourTableViewController tableView.scrollToTop(animated: true)//or false
在iOS 11上,adjustedContentInset
当呼叫状态栏可见或不可见时,用于正确滚动到顶部.
if (@available(iOS 11.0, *)) { [tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES]; } else { [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES]; }
迅速:
if #available(iOS 11.0, *) { tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true) } else { tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true) }
请勿使用
tableView.setContentOffset(.zero, animated: true)
有时可能会设置不正确的偏移量。例如,以我为例,该单元格实际上位于带有安全区域插图的视图上方。不好。
代替使用
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
对于具有a的表contentInset
,将内容偏移设置为CGPointZero
不起作用.它将滚动到内容顶部而不是滚动到桌面.
将内容插入考虑在内会产生以下结果:
[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
此代码允许您将特定部分滚动到顶部
CGRect cellRect = [tableinstance rectForSection:section]; CGPoint origin = [tableinstacne convertPoint:cellRect.origin fromView:]; [tableinstance setContentOffset:CGPointMake(0, origin.y)];
迅速:
tableView.setContentOffset(CGPointZero, animated: true)
除了已经说过的内容之外,您还可以创建一个扩展(Swift)或类别(Objective C),以便将来更轻松:
迅速:
extension UITableView { func scrollToTop(animated: Bool) { setContentOffset(CGPointZero, animated: animated) } }
只要您想将任何给定的tableView滚动到顶部,您就可以调用以下代码:
tableView.scrollToTop(animated: true)
由于我tableView
有各种各样的插图,所以这是唯一有效的方法:
迅捷3
if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 { tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) }
迅捷2
if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 { tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true) }
斯威夫特3
tableView.setContentOffset(CGPoint.zero, animated: true)
如果tableView.setContentOffset
不工作.
使用:
tableView.beginUpdates() tableView.setContentOffset(CGPoint.zero, animated: true) tableView.endUpdates()
斯威夫特:
如果您没有tableView标头:
tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
如果是这样 :
tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
我更喜欢以下内容,因为它考虑了插图.如果没有插入,它仍将滚动到顶部,因为插入将为0.
tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)