tutorial source example data collection ios uicollectionview

ios - source - uicollectionview swift 4 tutorial



UICollectionView auto scroll a la celda en IndexPath (8)

Antes de cargar la vista de colección, el usuario establece el número de imágenes en la matriz de la vista de colección. Todas las celdas no caben en la pantalla. Tengo 30 celdas y solo 6 en la pantalla.

La pregunta: ¿Cómo desplazarse a la celda con la imagen deseada automáticamente a la carga de UICollectionView?


Descubrí que el desplazamiento en viewWillAppear puede no funcionar de manera confiable porque la vista de colección aún no ha terminado su diseño; puede desplazarse al elemento incorrecto.

También encontré que el desplazamiento en viewDidAppear provocará que un destello momentáneo de la vista sin desplazamiento sea visible.

Y, si se desplaza cada vez a través de viewDidLayoutSubviews, el usuario no podrá desplazarse manualmente porque algunos diseños de colección causan el diseño de subvista cada vez que se desplaza.

Esto es lo que encontré funciona de manera confiable:

- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // If we haven''t done the initial scroll, do it once. if (!self.initialScrollDone) { self.initialScrollDone = YES; [self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath atScrollPosition:UICollectionViewScrollPositionRight animated:NO]; } }


Estoy totalmente de acuerdo con la respuesta anterior. Lo único es que para mí la solución fue establecer el código en viewDidAppear

viewDidAppear { [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; }

Cuando utilicé viewWillAppear, el desplazamiento no funcionó.


Puede usar GCD para enviar el desplazamiento a la siguiente iteración del ciclo de ejecución principal en viewDidLoad para lograr este comportamiento. El desplazamiento se realizará antes de que se muestre la vista de la colección en la pantalla, por lo que no parpadeará.

- (void)viewDidLoad { dispatch_async (dispatch_get_main_queue (), ^{ NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH; [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; }); }


Recomendaría hacerlo en collectionView: willDisplay: entonces puede estar seguro de que el delegado de la vista de colección ofrece algo. Aquí mi ejemplo:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { /// this is done to set the index on start to 1 to have at index 0 the last image to have a infinity loop if !didScrollToSecondIndex { self.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false) didScrollToSecondIndex = true } }


Todas las respuestas aquí - hacks. He encontrado una mejor manera de desplazar la vista de colección en algún lugar después de relaodData:
Diseño de la vista de colección de subclase, sea cual sea el diseño que utilice, anule el método prepareLayout, después de que la llamada súper establezca el desplazamiento que necesite.
ej .: https://.com/a/34192787/1400119


esto pareció funcionar para mí, es similar a otra respuesta, pero tiene algunas diferencias claras:

- (void)viewDidLayoutSubviews { [self.collectionView layoutIfNeeded]; NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems]; NSIndexPath *currentItem = [visibleItems objectAtIndex:0]; NSIndexPath *nextItem = [NSIndexPath indexPathForItem:someInt inSection:currentItem.section]; [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; }


Nueva respuesta editada:

Agregar esto en viewDidLayoutSubviews

-(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; }

Respuesta anterior que funciona para iOS anterior

Agregue esto en la vista viewWillAppear :

[self.view layoutIfNeeded]; [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];


Rápido:

your_CollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)

Swift 3

let indexPath = IndexPath(row: itemIndex, section: sectionIndex) collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.right, animated: true)

Desplazar la posición:

UICollectionViewScrollPosition.CenteredHorizontally / UICollectionViewScrollPosition.CenteredVertically