Я обнаружил, что прокрутка 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)[self.collectionView layoutIfNeeded];
раньше, что также работает, когда вы делаете это внутриviewDidLoad
.Новый, отредактированный ответ:
Добавьте это в
viewDidLayoutSubviews
SWIFT
Обычно
.centerVertically
это такObjC
Старый ответ работает для более старой iOS
Добавьте это в
viewWillAppear
:источник
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Я полностью согласен с приведенным выше ответом. Единственное, что для меня решением был установлен код в viewDidAppear
Когда я использовал viewWillAppear, прокрутка не работала.
источник
это, похоже, сработало для меня, похоже на другой ответ, но есть некоторые отличия:
источник
Swift:
Swift 3
Положение прокрутки:
источник
Вы можете использовать GCD для отправки прокрутки в следующую итерацию основного цикла выполнения в viewDidLoad для достижения такого поведения. Прокрутка будет выполнена до того, как представление коллекции отобразится на экране, поэтому мигания не будет.
источник
Я бы порекомендовал сделать это в.
collectionView: willDisplay:
Тогда вы можете быть уверены, что делегат представления коллекции что-то доставляет. Вот мой пример:источник
В качестве альтернативы упомянутому выше. Звонок после загрузки данных:
Swift
источник
Все ответы здесь - хаки. Я нашел лучший способ прокручивать представление коллекции где-нибудь после relaodData:
макет представления коллекции подклассов, какой бы макет вы ни использовали, переопределите метод prepareLayout, после супер-вызова установите то, что вам нужно.
пример: https://stackoverflow.com/a/34192787/1400119
источник