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")
}
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)
}
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.
Swift 4.2
collectionView.scrollToItem(at: IndexPath(item: pageNumber , section: 0), at: .centeredHorizontally, animated: true)
self.collectionView.layoutSubviews() // **Without this effect wont be visible**
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()