Прокрутите до элемента UICollectionView программно с помощью кнопки UIButton

У меня момент смятения, и я не могу решить очень простую вещь.

Мой 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)
}

Есть идеи?

10000