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