UICollectionView выделите элемент, не работающий с горизонтальным направлением

У меня есть UICollectionView в UIViewController с включенным пейджингом. По какой-то странной причине collectionView.scrollToItem работает, когда направление collectionview является vertical но не в том случае, когда направление horizontal. Это что-то, что я делаю неправильно или это должно произойти?

  //Test scrollToItem
  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let i = IndexPath(item: 3, section: 0)
    collectionView.reloadData()
      collectionView.scrollToItem(at: i, at: .top, animated: true)
      print("Selected")
  }

Ответы

Ответ 1

Для этой части:

collectionView.scrollToItem(at: i, at:.top, animated: true)

Когда направление прокрутки horizontal вам нужно использовать его at: left, at: right или at: centeredHorizontally. at: top для vertical направления.

Ответ 2

У меня возникли проблемы с реализацией этого в макете потока с введенным пейджингом на элемент. .CenteredHorizontally просто не будет работать для меня, поэтому я использую прокрутку для прямой и проверьте, есть ли данные перед прокруткой:

    if self.collectionView?.dataSource?.collectionView(self.collectionView!, cellForItemAt: IndexPath(row: 0, section: 0)) != nil {
        let rect = self.collectionView.layoutAttributesForItem(at: IndexPath(item: data[index], section: 0))?.frame
        self.collectionView.scrollRectToVisible(rect!, animated: false)
    }

Ответ 3

Swift 5 Xcode 10

collectionView.scrollToItem(at: IndexPath(item: pageNumber , section: 0), at: .centeredHorizontally, animated: true)
self.collectionView.layoutSubviews() // **Without this effect wont be visible**

Ответ 4

Swift 3:

Это работало для меня в режиме горизонтального просмотра.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

//Show 14th row as first row
self.activityCollectionView?.scrollToItem(at: IndexPath(row: 14, section: 0), at: UICollectionViewScrollPosition.right, animated: true)
}

Вы можете выбрать, будет ли требуемая ячейка в индексе находиться справа или слева в позиции прокрутки.

UICollectionViewScrollPosition.right or UICollectionViewScrollPosition.left.

Ответ 5

Для прокрутки элемента нет необходимости перезагружать данные. Удалите строку ниже вашего кода и попробуйте.

collectionView.reloadData()