J'ai trouvé que le défilement viewWillAppear
peut ne pas fonctionner de manière fiable car la vue de collection n'a pas encore terminé sa mise en page; vous pouvez faire défiler jusqu'au mauvais élément.
J'ai également constaté que le défilement viewDidAppear
provoquera un flash momentané de la vue non défilée pour être visible.
Et, si vous faites défiler à chaque fois viewDidLayoutSubviews
, l'utilisateur ne pourra pas faire défiler manuellement car certaines mises en page de collection provoquent une mise en page de sous-vue chaque fois que vous faites défiler.
Voici ce que j'ai trouvé fonctionne de manière fiable:
Objectif c :
- (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];
}
}
Rapide :
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
initialScrollDone
drapeau comme LenK l'a fait puisque cette méthode sera appelée plus d'une fois et si vous appelez scrollToItemAtIndexPath: plus d'une fois, il semble rendre la collectionView unscrollable (simulateur iOS iPhone 5 / iOS 8)[self.collectionView layoutIfNeeded];
avant, ce qui fonctionne également lorsque vous faites cela à l'intérieurviewDidLoad
.Nouvelle réponse modifiée:
Ajouter ceci dans
viewDidLayoutSubviews
RAPIDE
Normalement,
.centerVertically
c'est le casObjC
Ancienne réponse fonctionnant pour l'ancien iOS
Ajoutez ceci dans
viewWillAppear
:la source
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Je suis totalement d'accord avec la réponse ci-dessus. La seule chose est que pour moi, la solution a été de définir le code dans viewDidAppear
Lorsque j'ai utilisé le viewWillAppear, le défilement ne fonctionnait pas.
la source
cela a semblé fonctionner pour moi, c'est similaire à une autre réponse mais a quelques différences distinctes:
la source
Rapide:
Swift 3
Position de défilement:
la source
Vous pouvez utiliser GCD pour distribuer le défilement dans l'itération suivante de la boucle d'exécution principale dans viewDidLoad pour obtenir ce comportement. Le défilement sera effectué avant l'affichage de la vue de la collection à l'écran, il n'y aura donc pas de clignotement.
la source
Je recommanderais de le faire dans
collectionView: willDisplay:
Ensuite, vous pouvez être sûr que le délégué de vue de collection fournit quelque chose. Voici mon exemple:la source
Comme alternative à mentionné ci-dessus. Appel après le chargement des données:
Rapide
la source
Toutes les réponses ici - hacks. J'ai trouvé un meilleur moyen de faire défiler la vue de la collection quelque part après relaodData:
disposition de la vue de la collection de sous - classes quelle que soit la disposition que vous utilisez, remplacez la méthode prepareLayout, après le super appel, définissez le décalage dont vous avez besoin.
ex: https://stackoverflow.com/a/34192787/1400119
la source