103 votes

CollectionView sizeForItemAtIndexPath jamais appelé

Cela me rend fou! J'ai un UICollectionViewController comme indiqué ci-dessous:

class PhrasesCompactCollectionViewController: UICollectionViewController

Le numberOfSections et cellForItemAt sont appelés, mais la sizeForItemAtIndexPath n'est jamais appelée. Je suis en utilisant le même code quelque part d'autre et il déclenche correctement. J'utilise Xcode Beta 8 6.

func collectionView(collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAtIndexPath indexPath:  NSIndexPath) -> CGSize {

        return CGSize(width: 120, height:120) 
    }

268voto

almas Points 391

Vous devez indiquer que vous mettre en œuvre le protocole UICollectionViewDelegateFlowLayout dans votre déclaration de classe.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout

58voto

Shiv Kumar Points 482

Dans Swift 3+ Utiliser cette méthode:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}

Assurez-vous que votre classe est conforme à la fois Délégué

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout

16voto

Gaurav Rami Points 853

Swift 3

Pour définir la Taille des Cellules de UICollectionView, vous avez besoin de créer et de personnaliser des objets d' UICollectionViewFlowLayout. Personnaliser les propriétés et définir objet de mise en page à la UICollectionView objet.

Changement cellheight et de la cellule cellWidth objets en fonction de vos besoins (de la cellule la taille et de la largeur que vous voulez).

override func viewDidLoad() {
    super.viewDidLoad()

    let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
    let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
    let cellSize = CGSize(width: cellWidth , height:cellheight)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}

Assurez-vous que: si vous avez ajouté sizeForItemAt indexPath méthode doit alors RETIRER la méthode...

Supprimer La Méthode Ci-Dessous

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

9voto

H S Progr Points 441

Première classe doivent confirmer à UICollectionViewDelegateFlowLayout. Ensuite, vous devez écrire le code suivant dans le viewDidLoad():

//Pour dire la UICollectionView pour utiliser votre UIViewController de UICollectionViewDelegateFlowLayout méthodes

collectionView.delegate = self

// Si vous souhaitez définir votre propre collection de visualiser la disposition de flux

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)

En utilisant ce code UICollectionViewDelegateFlowLayout méthode

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

seront appelés, vous pouvez définir la taille de cette méthode.

-1voto

Charlie Seligman Points 717

J'ai eu ce problème hier soir. Enfin résolu à minuit, lorsque j'ai réalisé " didSelectItemAtIndex méthode n'a pas été clôturée avec une fermeture à crochet "}"

J'ai ajouté une fermeture à crochet à l'extrémité inférieure de la classe lors de la demande par l'erreur de compilation. Donc, en effet toutes les méthodes ci-dessous 'didSelectItemAtIndex" étaient à l'intérieur de cette méthode.

Poster ici au cas où quelqu'un d'autre les déchets 4 heures de leurs soirées sur celui-ci :-(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X