当前位置:  开发笔记 > 编程语言 > 正文

UITableView - 滚动到顶部

如何解决《UITableView-滚动到顶部》经验,为你挑选了16个好方法。

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

所以当我打电话时,我得到一个例外:

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

还有另一种滚动到表格视图顶部的方法吗?



1> catlan..:

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)


我首先尝试使用CGRectZero,它相当于CGRectMake(0,0,0,0).这不起作用,但奇怪的是上面的情况.我想它需要正宽度和高度.谢谢.
@PeterLapisu`self.tableView.scrollToRow(at:IndexPath(row:0,section:0),at:UITableViewScrollPosition.top,animated:true)`似乎在iOS 11中工作
有人注意到在iOS11中这一切都被打破了,在某些情况下没有正确滚动?
注意,你需要**动画:NO**如果你在scrollToRowAtIndexPath中运行它:以便使表开始在正确的位置.希望能帮助到你!
@ hasan83 CGRectMake(0,0,0,0)或CGRectZero不是可见的rect.我还会说[mainTableView setContentOffset:CGPointZero animated:YES]; 是更漂亮的表达.

2> fabb..:

我更喜欢

[mainTableView setContentOffset:CGPointZero animated:YES];

如果表视图上有顶部插图,则必须将其减去:

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


我之前评论的解决方案:`[tableView setContentOffset:CGPointMake(0.0f,-tableView.contentInset.top)animated:YES];`
当您具有表格页眉或页脚视图并希望它们也包含在内时,这是最佳使用方式.
番茄,番茄.嗯......这在写作中并不十分清楚.
这确实是一个清晰的代码,但是当你的`tableView`从顶部有非零`contentInset`时它不起作用.例如:`tableView.contentInset = UIEdgeInsetsMake(5.0f,0.0f,250.0f,0.0f);`.如果是这种情况,在你的代码中,`tableView`滚动到`(0.0f,5.0f)`.
在iOS 11上,您应该考虑改用`-scrollView.adjustedContentInset.top`。

3> A.G..:

可能的行动:

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)
  }


好的解决方案,scrollToFirstRow()适合我

4> Kof..:

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

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

希望这可以帮助.



5> Alessandro O..:

斯威夫特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中有tableHeaderView并且它是内联的(则滚动内容),则不是

6> Adrian..:

我遇到一个问题,调用一些空的方法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



7> Thanh Pham..:

在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)
}



8> ScottyBlades..:

请勿使用

 tableView.setContentOffset(.zero, animated: true)

有时可能会设置不正确的偏移量。例如,以我为例,该单元格实际上位于带有安全区域插图的视图上方。不好。

代替使用

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



9> Eran Goldin..:

对于具有a的表contentInset,将内容偏移设置为CGPointZero不起作用.它将滚动到内容顶部而不是滚动到桌面.

将内容插入考虑在内会产生以下结果:

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



10> 小智..:

此代码允许您将特定部分滚动到顶部

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



11> Esqarrouth..:

迅速:

tableView.setContentOffset(CGPointZero, animated: true)



12> ocwang..:

除了已经说过的内容之外,您还可以创建一个扩展(Swift)或类别(Objective C),以便将来更轻松:

迅速:

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

只要您想将任何给定的tableView滚动到顶部,您就可以调用以下代码:

tableView.scrollToTop(animated: true)



13> budidino..:

由于我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)
}



14> Исмаил Хасбу..:

斯威夫特3

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

如果tableView.setContentOffset不工作.

使用:

tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()



15> jmcastel..:

斯威夫特:

如果您没有tableView标头:

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

如果是这样 :

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



16> Jacob Caraba..:

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

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有