2017-10-04 5 views
0

J'ai une vue de collection horizontale des boutons. Lorsque l'un d'eux est cliqué, l'utilisateur est amené à un autre contrôleur de vue. Souvent, tous les boutons ne sont pas visibles, donc ce que je voudrais, c'est que le bouton sélectionné soit du côté le plus à gauche de la vue de la collection. J'essayais de faire cela avec la fonction scrollToItem. Le problème est qu'il continue à faire défiler la vue de collection tout le chemin vers la droite à chaque fois.ScrollToItem ne fonctionne pas correctement

Code pertinent:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return labelArray.count 
} 

//frees up the collection view when the scroll is active 
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 
    isScrolling = true 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 

    //possible problem 
    if isScrolling == false { 
     collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false) 
    } 

    let myLabel = cell.viewWithTag(1) as! UILabel 

    let myArray = labelArray[indexPath.row] 

    myLabel.text = labelArray[indexPath.row] 
    myLabel.textColor = UIColor.white 

    if myArray == labelArray[1] { 
     cell.backgroundColor = UIColor.black 
    } else { 
     cell.backgroundColor = UIColor(red: 56/255, green: 120/255, blue: 195/255, alpha: 1) 
    } 

    return cell 
} 

Toute aide serait grandement appréciée.

Répondre

0

Je l'ai eu pour travailler. Tout ce que je ne faisais que le changement

if isScrolling == false { 
    collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false) 
} 

à

if isScrolling == false { 
    let i = IndexPath(item: 1, section: 0) 
    collectionView.scrollToItem(at: i, at: .right, animated: false) 
} 

Auparavant, il faites défiler jusqu'à chaque cellule sans s'arrêter à chacun individu.

Donc, pour chaque article, je code en dur la valeur qui dépend de la section sélectionnée.

0

Vous appelez la méthode scrollToItem dans la méthode cellForItemAt, qui est appelée pour chaque cellule visible dans votre vue de collection. Donc, vous essayez essentiellement de faire défiler chaque cellule à mesure qu'elle devient visible. Essayez d'appeler la méthode scrollToItem dans la méthode didSelectItemAt comme ceci:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    collectionView.scrollToItem(at: indexPath, at: .left, animated: true) 
} 

Le didSelectItemAt n'est appelée lorsqu'une cellule est sélectionnée et fournit la indexPath de la cellule sélectionnée.

+0

J'ai donc essayé d'implémenter ceci dans la méthode didSelectItemAt. Il arrête la vue de collection du défilement vers le côté droit au début, le problème est que cela ne fait rien. –

+0

J'ai testé que le code ci-dessus, voir modifier, fonctionne dans une application de vue de collection simple que j'ai construit. Sans voir comment vous avez implémenté la méthode didSelectItemAt ou le reste du code de votre classe, je ne sais pas où est votre problème. – bjd23

+0

Je l'ai eu pour fonctionner dans la méthode cellForItemAt. Juste eu à coder en dur l'index de l'article. Je posterai la réponse. Merci pour votre aide. –