Lo estoy usando por UICollectionView
primera vez en mi aplicación para iPad. Lo configuré de UICollectionView
tal manera que su tamaño y el tamaño de celda sean iguales, lo que significa que solo se muestra una celda a la vez.
Problema: ahora, cuando el usuario se desplaza por UICollectionView, necesito saber qué celda está visible, tengo que actualizar otros elementos de la interfaz de usuario al cambiar. No encontré ningún método de delegado para esto. ¿Cómo puedo conseguir esto?
Código:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
Lo que he probado:
Como se UICollectionView
ajusta a UIScrollView
, obtuve cuando el desplazamiento del usuario termina con el UIScrollViewDelegate
método
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Pero dentro de la función anterior, ¿cómo puedo obtener el índice de celda visible actual de UICollectionView
???
fuente
Respuestas:
El método [collectionView visibleCells] le proporciona todas las matrices de visibleCells que desee. Úsalo cuando quieras
Actualización a Swift 5:
fuente
scrollViewDidScroll:
método delegado proporciona actualizaciones de la vista de desplazamiento cada vez que finaliza un desplazamiento (y probablemente sea una mejor opción aquí). A diferencia delscrollViewDidEndDecelerating:
método delegado que solo se llama cuando la vista de desplazamiento "se detiene [desde un gran desplazamiento] " (consulte el encabezado de UIScrollView)...DidScroll
se llama muchas veces, incluso durante un desplazamiento corto. Puede ser algo bueno o no, dependiendo de lo que uno quiera hacer.indexPathsForVisibleItems
podría funcionar para la mayoría de las situaciones, pero a veces devuelve una matriz con más de una ruta de índice y puede ser complicado averiguar cuál desea. En esas situaciones, puede hacer algo como esto:Esto funciona especialmente bien cuando cada elemento de la vista de colección ocupa toda la pantalla.
Versión rápida
fuente
visibleIndexPath
veces será nulo, así queif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Rápido 5 :
Respuestas de trabajo combinadas en Swift 2.2:
fuente
En aras de la integridad, este es el método que terminó funcionando para mí. Fue una combinación de los métodos de @Anthony & @ iAn.
fuente
Probablemente sea mejor usar los métodos UICollectionViewDelegate: (Swift 3)
fuente
didEndDisplaying
a los documentos: le dice al delegado que la celda especificada se eliminó de la vista de colección. Utilice este método para detectar cuándo se elimina una celda de una vista de colección, en lugar de monitorear la vista en sí para ver cuándo desaparece. Entonces no creo quedidEndDisplaying
se llame cuando se muestra la celda.Solo quiero agregar para otros: por alguna razón, no obtuve la celda que era visible para el usuario cuando me desplazaba a la celda anterior en collectionView con pagingEnabled.
Entonces inserto el código dentro de dispatch_async para darle un poco de "aire" y esto funciona para mí.
fuente
DispatchQueue.main.async {
cuando la llamada se inicia desde algo comofunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
como se mencionó anteriormente. Creo que el problema, en algún lugar de UIKit, es realmente el mismo en mi caso que esta respuesta.fuente
Swift 3.0
La solución más simple que le dará indexPath para celdas visibles.
devolverá la matriz de indexpath.
Simplemente tome el primer objeto de la matriz como esta.
Supongo que también debería funcionar bien con Objective - C.
fuente
UICollectionView índice de celda visible actual: Swift 3
fuente
convertir la respuesta de @ Anthony a Swift 3.0 funcionó perfectamente para mí:
fuente
Puedes usar
scrollViewDidEndDecelerating
: para estofuente
Esta es una vieja pregunta pero en mi caso ...
fuente
También revisa este fragmento
fuente
En este hilo, hay tantas soluciones que funcionan bien si la celda toma pantalla completa pero usan límites de vista de colección y puntos medios de Visible rect.Sin embargo, hay una solución simple para este problema.
con esto, puede obtener indexPath de la celda visible. He agregado DispatchQueue porque cuando desliza el dedo más rápido y si por un breve momento se muestra la siguiente celda, sin dispactchQueue obtendrá indexPath de la celda que se muestra brevemente, no la celda que se muestra en la pantalla.
fuente
prueba esto, funciona. (en el siguiente ejemplo, tengo 3 celdas, por ejemplo).
fuente
Swift 3 y Swift 4:
Si desea mostrar el número real, puede agregar +1
fuente