Descubrí que el desplazamiento 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 descubrí que el desplazamiento hacia adentro viewDidAppear
hará que se vea un destello momentáneo de la vista sin desplazamiento.
Y, si se desplaza cada vez viewDidLayoutSubviews
, el usuario no podrá desplazarse manualmente porque algunos diseños de colección provocan un diseño de subvista cada vez que se desplaza.
Esto es lo que encontré que funciona de manera confiable:
C objetivo :
- (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];
}
}
Rápido:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
initialScrollDone
bandera como lo ha hecho LenK, ya que este método se llamará más de una vez y si llama a scrollToItemAtIndexPath: más de una vez parece hacer que collectionView no se pueda desplazar (simulador de iOS iPhone 5 / iOS 8)[self.collectionView layoutIfNeeded];
antes, lo que también funciona cuando haces esto dentroviewDidLoad
.Respuesta nueva y editada:
Agregar esto en
viewDidLayoutSubviews
RÁPIDO
Normalmente,
.centerVertically
es el casoObjC
La respuesta anterior funciona para iOS anterior
Agregue esto en
viewWillAppear
:fuente
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Estoy totalmente de acuerdo con la respuesta anterior. Lo único es que para mí la solución fue configurar el código en viewDidAppear
Cuando usé viewWillAppear, el desplazamiento no funcionó.
fuente
esto pareció funcionar para mí, es similar a otra respuesta pero tiene algunas diferencias claras:
fuente
Rápido:
Swift 3
Posición de desplazamiento:
fuente
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 colección en la pantalla, por lo que no habrá parpadeo.
fuente
Recomendaría hacerlo en
collectionView: willDisplay:
Entonces, puede estar seguro de que el delegado de vista de colección ofrece algo. Aquí mi ejemplo:fuente
Como alternativa a lo mencionado anteriormente. Llamar después de la carga de datos:
Rápido
fuente
Todas las respuestas aquí: trucos. Encontré una mejor manera de desplazar la vista de colección en algún lugar después de relaodData:
diseño de vista de colección de subclase cualquiera que sea el diseño que use, método de anulación prepareLayout, después de la super llamada establezca el desplazamiento que necesite.
ej .: https://stackoverflow.com/a/34192787/1400119
fuente