UITableView: desplácese hasta la parte superior
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?
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)
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];
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)
}
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.
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)