Odkryłem, że przewijanie viewWillAppear
może nie działać niezawodnie, ponieważ widok kolekcji nie zakończył jeszcze swojego układu; możesz przewinąć do niewłaściwej pozycji.
Odkryłem również, że przewijanie viewDidAppear
spowoduje, że widoczny będzie chwilowy błysk nieprzewijanego widoku.
A jeśli przewijasz za każdym razem viewDidLayoutSubviews
, użytkownik nie będzie mógł ręcznie przewijać, ponieważ niektóre układy kolekcji powodują układ widoku podrzędnego za każdym razem, gdy przewijasz.
Oto, co znalazłem, działa niezawodnie:
Cel 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];
}
}
Szybki:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
initialScrollDone
flagi, tak jak zrobił to LenK, ponieważ ta metoda zostanie wywołana więcej niż jeden raz, a jeśli wywołasz scrollToItemAtIndexPath: więcej niż raz wydaje się, że renderuje kolekcję, której nie można przewijać (symulator iOS iPhone 5 / iOS 8)[self.collectionView layoutIfNeeded];
wcześniej, co również działa, gdy robisz to w środkuviewDidLoad
.Nowa, zredagowana odpowiedź:
Dodaj to
viewDidLayoutSubviews
SZYBKI
Zwykle tak
.centerVertically
jestObjC
Stara odpowiedź działa na starszym iOS
Dodaj to w
viewWillAppear
:źródło
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Całkowicie zgadzam się z powyższą odpowiedzią. Tyle tylko, że dla mnie rozwiązaniem był ustawiony kod w viewDidAppear
Kiedy użyłem viewWillAppear, przewijanie nie działało.
źródło
to wydawało się działać dla mnie, jest podobne do innej odpowiedzi, ale ma kilka wyraźnych różnic:
źródło
Szybki:
Szybki 3
Pozycja przewijania:
źródło
Możesz użyć GCD, aby wysłać przewijanie do następnej iteracji głównej pętli uruchamiania w viewDidLoad, aby osiągnąć to zachowanie. Przewijanie zostanie wykonane przed wyświetleniem widoku kolekcji na ekranie, więc nie będzie migania.
źródło
Poleciłbym to zrobić w
collectionView: willDisplay:
Wtedy możesz być pewien, że delegat widoku kolekcji coś dostarcza. Oto mój przykład:źródło
Jako alternatywa dla wyżej wymienionych. Zadzwoń po załadowaniu danych:
Szybki
źródło
Wszystkie odpowiedzi tutaj - hacki. Znalazłem lepszy sposób na przewijanie widoku kolekcji gdzieś po relaodData:
Układ widoku kolekcji podklas, jaki układ używasz, nadpisz metodę przygotowaniaLayout, po super wywołaniu ustaw wszystko, czego potrzebujesz.
np .: https://stackoverflow.com/a/34192787/1400119
źródło