2011-11-24 16 views
31

una pregunta simple pero no parecen tener la terminología correcta para buscar Stackoverflow por ella.Detectar la celda superior corriente en un UITableView después de desplazarse

Tengo un UITableView sin secciones, el usuario puede desplazarse hacia arriba y hacia abajo una larga lista de datos (filas) se presenta dentro de este tableview.

Pregunta: cómo puedo detectar el número de fila de celda más superior después de que el usuario se desplazó. (por ejemplo, si el usuario se desplaza hacia abajo 30 celdas, la celda superior después de que el desplazamiento es = 30)

Respuesta

59

Usted podría tratar de usar UITableView 's -indexPathsForVisibleRows o -indexPathForRowAtPoint.

Por ejemplo, digamos que desea imprimir el indexPath de la celda visible más alta, cuando se deja de arrastrar su mesa. Se podría hacer algo como esto:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 
    NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0]; 
    NSLog(@"first visible cell's section: %i, row: %i", firstVisibleIndexPath.section, firstVisibleIndexPath.row); 
} 

para SWIFT 3,0

let topVisibleIndexPath:IndexPath = self.tableView.indexPathsForVisibleRows![0] 
+2

Me ordenar la matriz ya que no hay nada (por lo que puedo ver) en la documentación que dice el índice las rutas se ordenan en orden ascendente. – jbat100

+0

Muy buen punto, elevé tu respuesta (incluso si mi prueba rápida parece devolver la celda más alta en el primer elemento de la matriz ...) – phi

+1

Es una pregunta diferente, pero comprueba 'tableView scrollToRowAtIndexPath' – phi

29

Usted obtiene los caminos de índice para las filas visibles

NSArray* indexPaths = [tableView indexPathsForVisibleRows]; 

use y luego por compare:

NSArray* sortedIndexPaths = [indexPaths sortedArrayUsingSelector:@selector(compare:)]; 

A continuación, obtener la fila del primer elemento

NSInteger row = [(NSIndexPath*)[sortedIndexPaths objectAtIndex:0] row]; 
+0

Esta solución funciona en 'UICollectionView's junto con' UITableView's – aytunch

6

El código Swift 3:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    let firstVisibleIndexPath = self.tableView.indexPathsForVisibleRows?[0] 
    print("First visible cell section=\(firstVisibleIndexPath?.section), and row=\(firstVisibleIndexPath?.row)") 
} 
+0

Esta función se invoca continuamente, creo que la mejor respuesta para la pregunta original es algo como scrollViewDidEndDecelerating o scrollViewDidEndDragging –

+0

Hola @WilliamT. Actualicé mi respuesta. ¿Podrías eliminar downvote? – mathema

Cuestiones relacionadas