У меня момент смятения, и я не могу решить очень простую вещь.
Мой CollectionView имеет 50 ячеек, и я хотел бы прокручивать назад и вперед между ячейками, используя кнопку «Далее» и «Назад». Я знаю о методе scrollToItemAtIndexPath, но у меня проблемы с поиском правильного IndexPath. Кто-то может мне помочь?
Это мой код:
// My personal method
-(void)scrollYearAtIndex:(NSInteger)index {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:index inSection:0];
[_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
}
// Show Next Items
-(void)didScrollNextYear {
[self scrollYearAtIndex:????];
}
// Show Previous Items
-(void)didScrollPreviousYear {
[self scrollYearAtIndex:????];
}
Всего 3 ответа
let indexPaths : NSArray = self.collectionView!.indexPathsForSelectedItems()
let indexPath : NSIndexPath = indexPaths[0] as NSIndexPath
Это даст вам текущий выбранный путь индекса. В методе didScrollNextYear увеличьте indexPath.row на единицу. А в didScrollPreviousYear
уменьшите indexPath.row на единицу.
Образец кода:
// Show Next Items -(void)didScrollNextYear { let indexPaths : NSArray = self.collectionView!.indexPathsForSelectedItems() let indexPath : NSIndexPath = indexPaths[0] as NSIndexPath [self scrollYearAtIndex: indexPath.row+1]; }
Я дал ответ в Swift
. Вы можете написать ту же логику в Objective-C
.
Чтобы получить следующий indexPath
, получите last
indexPath
отсортированного массива indexPathsForVisibleItems
и indexPathsForVisibleItems
на 1.
Чтобы получить предыдущий indexPath
, получите first
indexPath
отсортированного массива indexPathsForVisibleItems
и indexPathsForVisibleItems
на 1.
func didScrollNextYear() {
if let index = self.collectionView.indexPathsForVisibleItems.sorted().last?.row {
let nextIndex = index+1
if nextIndex < self.collectionView.numberOfItems(inSection: 0) {
self.collectionView.scrollToItem(at: IndexPath(row: nextIndex, section: 0), at: .centeredHorizontally, animated: true)
}
}
}
func didScrollPreviousYear() {
if let index = self.collectionView.indexPathsForVisibleItems.sorted().first?.row {
let previousIndex = index-1
if previousIndex >= 0 {
self.collectionView.scrollToItem(at: IndexPath(row: previousIndex, section: 0), at: .centeredHorizontally, animated: true)
}
}
}
Вызовите эту функцию для следующей и предыдущей кнопки IBAction
func scrollToNextCell()
{
let collectionView = yourCollectionView
let cellSize = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
let contentOffset = collectionView!.contentOffset;
collectionView!.scrollRectToVisible(CGRect(x: contentOffset.x + cellSize.width, y: contentOffset.y, width: cellSize.width, height: cellSize.height), animated: true)
}
func scrollToPreviousCell()
{
let collectionView = yourCollectionView
let cellSize = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
let contentOffset = collectionView!.contentOffset;
collectionView!.scrollRectToVisible(CGRect(x: contentOffset.x - cellSize.width, y: contentOffset.y, width: cellSize.width, height: cellSize.height), animated: true)
}