Прокрутить до элемента UICollectionView программно с помощью UIButton - PullRequest
0 голосов
/ 17 мая 2019

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

В моем 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 ]

1 голос
/ 17 мая 2019

Я дал ответ в Swift.Вы можете написать ту же логику в Objective-C.

. Чтобы получить следующее indexPath, получите last indexPath отсортированного массива indexPathsForVisibleItems и увеличьте на 1.

* 1010.* Чтобы получить предыдущий indexPath, получите first indexPath отсортированного массива 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)
        }
    }
}
1 голос
/ 17 мая 2019
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];
}
0 голосов
/ 17 мая 2019

Вызов этой функции для следующей и предыдущей кнопки 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)
}
...