web-dev-qa-db-fra.com

UICollectionView faites défiler jusqu'à l'élément qui ne fonctionne pas avec la direction horizontale

J'ai une UICollectionView dans une UIViewController avec la pagination activée. Pour une raison étrange, collectionView.scrollToItem fonctionne lorsque la direction de collectionview est vertical mais ne le fait pas lorsque direction est horizontal Est-ce là quelque chose que je fais mal ou est-ce que cela est censé se produire?

  //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")
  }
13
kye

J'ai eu du mal à mettre cela en œuvre dans une structure de flux avec pagination entrée par article. Le .centeredHorizontally ne fonctionnerait tout simplement pas pour moi, donc j'utilise scroll to rect et Check il y a des données avant de faire défiler:

    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)
    }
6
Pippo

Swift 3:  

Cela a fonctionné pour moi sur la vue de collection horizontale.

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)
}

Vous pouvez choisir si la cellule souhaitée à l'index doit être à droite ou à gauche en position de défilement. 

UICollectionViewScrollPosition.right or UICollectionViewScrollPosition.left.
1
A.G

Swift 4.2  

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

Pour faire défiler l'élément, il n'y a pas besoin de reloadData. Supprimez la ligne ci-dessous de votre code et essayez.

collectionView.reloadData()
0
Apurv