Ich habe das Scrollen gefunden viewWillAppear
möglicherweise nicht zuverlässig funktioniert, da das Layout der Sammlungsansicht noch nicht fertig ist. Sie können zum falschen Element scrollen.
Ich habe auch das Scrollen gefunden viewDidAppear
ein kurzes Aufblitzen der nicht gescrollten Ansicht sichtbar wird.
Wenn Sie jedes Mal viewDidLayoutSubviews
einen Bildlauf durchführen, kann der Benutzer nicht manuell einen Bildlauf durchführen, da einige Sammlungslayouts bei jedem Bildlauf ein Layout der Unteransicht verursachen.
Folgendes funktioniert zuverlässig:
Ziel 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];
}
}
Swift:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
initialScrollDone
Flags wie bei LenK hervorheben, da diese Methode mehrmals aufgerufen wird und wenn Sie scrollToItemAtIndexPath aufrufen: mehr als einmal scheint es die collectionView unscrollbar zu machen (iOS-Simulator iPhone 5 / iOS 8)[self.collectionView layoutIfNeeded];
vorher anrufen , was auch funktioniert, wenn Sie dies innerhalb tunviewDidLoad
.Neue, bearbeitete Antwort:
Fügen Sie dies hinzu
viewDidLayoutSubviews
SCHNELL
Normalerweise
.centerVertically
ist das der FallObjC
Alte Antwort für älteres iOS
Fügen Sie dies hinzu in
viewWillAppear
:quelle
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Ich stimme der obigen Antwort voll und ganz zu. Das einzige ist, dass für mich die Lösung den Code in viewDidAppear gesetzt hat
Als ich viewWillAppear verwendet habe, hat das Scrollen nicht funktioniert.
quelle
Dies schien für mich zu funktionieren, es ähnelt einer anderen Antwort, weist jedoch einige deutliche Unterschiede auf:
quelle
Schnell:
Swift 3
Bildlaufposition:
quelle
Sie können GCD verwenden, um den Bildlauf in die nächste Iteration der Hauptlaufschleife in viewDidLoad zu senden, um dieses Verhalten zu erreichen. Der Bildlauf wird ausgeführt, bevor die Sammlungsansicht auf dem Bildschirm angezeigt wird, sodass kein Blinken erfolgt.
quelle
Ich würde empfehlen, dies in zu tun.
collectionView: willDisplay:
Dann können Sie sicher sein, dass der Delegat der Sammlungsansicht etwas liefert. Hier mein Beispiel:quelle
Als Alternative zu den oben genannten. Aufruf nach dem Laden der Daten:
Schnell
quelle
Alle Antworten hier - Hacks. Ich habe einen besseren Weg gefunden, um die Sammlungsansicht irgendwo nach relaodData zu scrollen:
Layout der Unterklassen-Sammlungsansicht, welches Layout auch immer Sie verwenden, überschreiben Sie die Methode prepareLayout, und legen Sie nach dem Superaufruf fest, welchen Versatz Sie benötigen.
Beispiel: https://stackoverflow.com/a/34192787/1400119
quelle