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)