2

J'ai un UICollectionView avec 142 cellules. 7.5 sont visibles à la fois. Je déplace une cellule de indexPath 0 pour dire 100. Mais je veux également faire défiler vers cette nouvelle position.UICollectionview scrollToItemAtIndexPath, ne pas charger les cellules visibles jusqu'à ce que l'animation soit terminée

Le code ci-dessous fonctionne correctement. Mais il anime le mouvement et défile, mais charge ensuite les cellules devant et derrière la cellule centrale/déplacée par la suite. Je pense que c'est parce que les cellules sont réutilisables. mais avec 142, je ne peux pas les pré-charger tous

Ce n'est pas le plus bel effet, je voudrais pré-charger les cellules entourant la nouvelle position, 4 avant et 4 après indexPath 100, puis voir le animation du mouvement et défilement. Pouvez-vous aider s'il vous plaît?

UIView.animateWithDuration(animationSpeed, animations: {() -> Void in 
    self.collectionView.layoutIfNeeded() 
    self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem:self.indexPathSelected.row, 
               inSection:0), 
               atScrollPosition: .CenteredHorizontally, 
               animated: true) 

}) 

Répondre

0

La seule réponse que j'ai trouvée est d'ajouter quelques secondes à l'animation. De cette façon, les cellules sont chargées lorsque le défilement arrive

+0

Afficher des exemples de le faire – Edu

+0

Ce genre de fonctionne mais c'est assez instable –

4

J'utilise dispatch_async pour mettre à jour l'interface utilisateur et cela fonctionne.

let numberOfSections = self.collectionView.numberOfSections() 
let numberOfRows = self.collectionView.numberOfItemsInSection(numberOfSections-1) 

    if numberOfRows > 0 { 
     dispatch_async(dispatch_get_main_queue(), { 
      let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: (numberOfSections-1)) 
      self.collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true) 
     }) 
    } 
+0

perdu 2 heures ... merci beaucoup! – gasho

11

Swift 3.0 ou jusqu'à

add "view.layoutIfNeeded()" avant la mise en œuvre méthode scrollToItem, idéalement dans viewWillAppear

override func viewWillAppear(_ animated: Bool) { 
super.viewWillAppear(animated) 
view.layoutIfNeeded() 
    colView.scrollToItem(at: IndexPath(item: 4, section: 0), at: .centeredHorizontally, animated: true)}