Я обнаружил, что прокрутка viewWillAppearможет работать ненадежно, потому что представление коллекции еще не завершило свою компоновку; вы можете перейти к неправильному элементу.
Я также обнаружил, что прокрутка viewDidAppearвызывает кратковременную вспышку непрокрученного представления.
И, если вы прокручиваете каждый раз viewDidLayoutSubviews, пользователь не сможет прокручивать вручную, потому что некоторые макеты коллекций вызывают макет subview каждый раз, когда вы прокручиваете.
Вот то, что я обнаружил, надежно работает:
Цель 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флага, как это сделал LenK, поскольку этот метод будет вызываться более одного раза, и если вы вызовете scrollToItemAtIndexPath: более одного раза, кажется, что collectionView не прокручивается (симулятор iOS iPhone 5 / iOS 8)