UITableView: desplácese hasta la parte superior

Resuelto Ilya Suzdalnitski asked hace 54 años • 37 respuestas

En mi vista de tabla tengo que desplazarme hasta la parte superior. Pero no puedo garantizar que el primer objeto sea la sección 0, fila 0. Puede ser que mi vista de tabla comience desde la sección número 5.

Entonces recibo una excepción cuando llamo:

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

¿Existe otra forma de desplazarse hasta la parte superior de la vista de tabla?

Ilya Suzdalnitski avatar Jan 01 '70 08:01 Ilya Suzdalnitski
Aceptado

UITableView es una subclase de UIScrollView, por lo que también puedes usar:

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

O

[mainTableView setContentOffset:CGPointZero animated:YES];

Y en rápido:

mainTableView.setContentOffset(CGPointZero, animated:true)

Y en Swift 3 y superiores:

mainTableView.setContentOffset(.zero, animated: true)
catlan avatar Apr 07 '2009 10:04 catlan

Nota : esta respuesta no es válida para iOS 11 y versiones posteriores.

yo prefiero

[mainTableView setContentOffset:CGPointZero animated:YES];

Si tiene un recuadro superior en su vista de tabla, debe restarlo:

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];
fabb avatar Jan 17 '2012 15:01 fabb

Posibles acciones:

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

5

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

Desactivar desplazamiento hacia arriba:

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

Modifíquelo y utilícelo según los requisitos.

veloz 4

  func scrollToFirstRow() {
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }
Alvin George avatar Feb 16 '2016 09:02 Alvin George

Es mejor no usar NSIndexPath (tabla vacía), ni asumir que el punto superior es CGPointZero (insertos de contenido), eso es lo que uso.

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

Espero que esto ayude.

Kof avatar Aug 13 '2014 19:08 Kof

Rápido 4 :

Esto funciona muy bien:

//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)
Alessandro Ornano avatar Oct 08 '2017 12:10 Alessandro Ornano