ios paging uicollectionview

ios - Iniciar UICollectionView en una ruta de índice específica



paging (9)

Así que resolví esto de una manera diferente, usando el método UICollectionViewDelegate y un Bool único:

Swift 2:

var onceOnly = false internal func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { if !onceOnly { let indexToScrollTo = NSIndexPath(forRow: row, inSection: section) self.problemListCollectionView.scrollToItemAtIndexPath(indexToScrollTo, atScrollPosition: .Left, animated: false) onceOnly = true } }

Swift 3:

var onceOnly = false internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { if !onceOnly { let indexToScrollTo = IndexPath(item: row, section: section) self.problemListCollectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false) onceOnly = true } }

Este código se ejecuta antes de que se produzca cualquier animación (así que realmente se carga hasta este punto), lo cual es mejor que intentar llamar a viewDidAppear , y no tuve éxito con él en viewWillAppear .

Actualmente tengo una vista de colección que hace una paginación horizontal donde cada celda está en pantalla completa. Lo que quiero hacer es que la vista de colección comience en un índice específico cuando se muestre.

En este momento estoy usando scrollToItemAtIndexPath: atScrollPosition: animated: con el conjunto animado en NO pero que aún carga el primer índice primero antes de que pueda desplazarse al elemento específico. También parece que solo puedo usar este método en ViewDidAppear para que muestre la primera celda y luego parpadee en la celda que quiero mostrar. Oculto esto ocultando la vista de colección hasta que el pergamino haya terminado pero no parece ideal.

¿Hay alguna forma mejor de hacer esto que no sea la forma en que lo describí?

¡Gracias!


Esto es lo que funcionó para mí (en una clase UICollectionViewController):

private var didLayoutFlag: Bool = false public override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if let collectionView = self.collectionView { if !self.didLayoutFlag { collectionView.scrollToItemAtIndexPath(self.viewModel.initialIndexPath, atScrollPosition: .None, animated: false) self.didLayoutFlag = true } } }


Hey he resuelto con el objetivo c. Creo que esto es útil para ti. Puedes convertir Objective c a swift también. Aquí está mi Código:

** En mi caso, al hacer clic en el botón, activo el índice específico, que es 3 **

para Vertical

- (IBAction)Click:(id *)sender { NSInteger index=3; CGFloat pageHeight = self.collectionView.frame.size.height; CGPoint scrollTo = CGPointMake(0, pageHeight * index); [self.collectionView setContentOffset:scrollTo animated:YES]; }

Para Horizontal

- (IBAction)Click:(id *)sender { NSInteger index=3; CGFloat pageWidth = self.collectionView.frame.size.width; CGPoint scrollTo = CGPointMake(pageWidth * index, 0); [self.collectionView setContentOffset:scrollTo animated:YES]; }

Espero que te pueda ayudar.


Lamentablemente, cada una de estas respuestas existentes es, al menos en parte, incorrecta o no responde la pregunta exacta que se hace. Resolví este problema con un compañero de trabajo que no recibió ninguna de estas respuestas.

Todo lo que necesita hacer es configurar el desplazamiento de contenido sin animación en el desplazamiento de contenido correcto y luego llamar a recargar datos. (O omita la llamada a reloadData si aún no se ha cargado). Debe hacer esto en viewDidLoad si nunca desea que se cree la primera celda.

Esta respuesta asume que la vista de la colección se desplaza horizontalmente y que el tamaño de las celdas es del mismo tamaño que la vista, pero el concepto es el mismo si desea desplazarse verticalmente o si las celdas tienen un tamaño diferente. Además, si su CollectionView tiene más de una sección, tiene que hacer un poco más de matemáticas para calcular el desplazamiento del contenido, pero el concepto sigue siendo el mismo.

func viewDidLoad() { super.viewDidLoad() let pageSize = self.view.bounds.size let contentOffset = CGPoint(x: pageSize.width * self.items.count, y: 0) self.collectionView.setContentOffset(contentOffset, animated: false) }


Para resolver este problema utilicé parcialmente la respuesta del greenhouse .

/// Edit var startIndex: Int! = 0 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) collectionView.setNeedsLayout() collectionView.layoutIfNeeded() collectionView.scrollToItemAtIndexPath( NSIndexPath(forItem: 0, inSection: startIndex), atScrollPosition: .None, animated: false) }

El problema parece estar en el tamaño incorrecto de collectionView . Después de establecer el diseño, scrollToItemAtIndexPath produce el resultado necesario.

También parece que este problema solo persiste cuando se usa una Collection View dentro de un UIViewController .


Pase el indexPath del primer VC a la vista de colección en el método DidSelectItemAtIndexPath. En viewDidLoad de su vista de colección, use el método scrollToItemAtIndexPath:atScrollPosition:animated: configure animated a NO y atScrollPosition a UICollectionViewScrollPositionNone . Me gusta esto:

[self.collectionView scrollToItemAtIndexPath:self.indexPathFromVC atScrollPosition:UICollectionViewScrollPositionNone animated:NO];


Swift 3.0 probado y funciona.

var onceOnly = false internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { if !onceOnly { //set the row and section you need. let indexToScrollTo = IndexPath(row: 1, section: indexPath.section) self.fotmCollectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false) onceOnly = true } }


Vine aquí teniendo este mismo problema y encontré que en mi caso, este problema fue causado porque ViewController en mi guión gráfico se configuró como tamaño ''freeform''.

Supongo que se llama a viewWillLayoutSubviews para calcular el tamaño correcto cuando la vista se carga por primera vez si las dimensiones del guión gráfico dejan esto en claro. (Había dimensionado mi viewController en mi guión gráfico para que fuera de "forma libre", por lo que podría ser muy alto para ver / editar muchas celdas en tableView largo dentro de mi collectionView).

Descubrí que el enfoque de victor.vasilica e invernadero es: poner el comando ''scrollToRow'' en viewWillLayoutSubviews funcionó perfectamente para solucionar el problema.

Sin embargo, también descubrí que una vez que hice el VC en el tamaño "fijo" de mi guión gráfico nuevamente, el problema desapareció de inmediato y pude configurar la celda inicial desde viewWillAppear. Su situación puede ser diferente, pero esto me ayudó a entender lo que estaba pasando en mi situación y espero que mi respuesta pueda ayudar a informar a otros con este problema.


esto pareció funcionar para mí:

- (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]; }