UICollectionview scrollToItemAtIndexPath, не загружая видимые ячейки до завершения анимации
У меня есть UICollectionView
с 142 ячейками. 7.5 видны в любое время.
Я перемещаю камеру из indexPath
0, чтобы сказать 100. Но я также хочу перейти к этой новой позиции.
Код ниже работает нормально. Но он оживляет движение и прокрутку, но затем загружает ячейки перед и за центральной / перемещенной ячейкой впоследствии. Я думаю, потому что клетки многоразовые. но с 142 я не могу предварительно загрузить их все
Это не самый хороший эффект, я хотел бы предварительно загрузить ячейки, окружающие новую позицию, 4 до и 4 после indexPath
100, а затем увидеть анимацию движения и прокрутки. не могли бы вы помочь, пожалуйста?
UIView.animateWithDuration(animationSpeed, animations: {() -> Void in
self.collectionView.layoutIfNeeded()
self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem:self.indexPathSelected.row,
inSection:0),
atScrollPosition: .CenteredHorizontally,
animated: true)
})
6 ответов
Единственный ответ, который я нашел, - добавить несколько секунд к анимации. Таким образом, клетки загружаются, когда появляется свиток
Swift 3.0 ИЛИ вверх
добавить "view.layoutIfNeeded()" перед реализацией метода scrollToItem, в идеале в viewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
view.layoutIfNeeded()
colView.scrollToItem(at: IndexPath(item: 4, section: 0), at: .centeredHorizontally, animated: true)}
Я использую dispatch_async для обновления пользовательского интерфейса, и он работает.
let numberOfSections = self.collectionView.numberOfSections()
let numberOfRows = self.collectionView.numberOfItemsInSection(numberOfSections-1)
if numberOfRows > 0 {
dispatch_async(dispatch_get_main_queue(), {
let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: (numberOfSections-1))
self.collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
})
}
Лучшее решение, которое я нашел, было использовать DispatchQueue
,
Swift 4.2:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let index = items.firstIndex(of: preSelectedItem) {
DispatchQueue.main.async {
self.collectionView.scrollToItem(at: IndexPath(item: index, section: 0), at: .top, animated: false)
}
}
}
@ Политта ответ правильный. Вот как вы можете реализовать то, что хотите в Objective C:
- (void)scrollToBottomWithoutAnimation{
NSInteger lastVisibleRowIndex = (NSInteger)self.myItems.count - 1;
NSIndexPath *lastVisibleIndexPath = [NSIndexPath indexPathForRow: lastVisibleRowIndex inSection:0];
[self.collectionView scrollToItemAtIndexPath:lastVisibleIndexPath atScrollPosition: UICollectionViewScrollPositionCenteredVertically animated:NO];
}
â € ‹
По вашему мнению, метод viewWillAppear:
dispatch_async(dispatch_get_main_queue(), ^{
[self scrollToBottomWithoutAnimation];
});
Вам нужно позвонить
[self.view layoutIfNeeded]
прежде чем звонить
scrollToBottomWithoutAnimation