1

Je souhaite être en mesure d'appeler ma classe UICollectionViewCell dans la fonction sizeForItemAtIndexPath. Comme ceci:Appelez une cellule UICollectionView dans sizeForItemAtIndexPath

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

    let cell = MyCollectionViewCell() 

    let itemHeights = cell.titleLabel.frame.size.height + cell.subtitleLabel.frame.size.height + 20 

    return CGSize(width: self.view.frame.size.width - 30, height: itemHeights + cell.thumbnail.frame.size.height) 

} 

Le problème est que cell.titleLabel.frame.size.height, cell.subtitleLabel.frame.size.height et cell.thumbnail.frame.size.height retournent tous nil. Je suppose que c'est parce que chaque fois que sizeForItemAtIndexPath est appelée, la cellule n'a pas encore été chargée et cellForItemAtIndexPath n'a pas encore été appelée.

J'ai besoin de savoir cela parce que le cell.titleLabel peut être plusieurs lignes et largeurs qui sont définies dans le cellForItemAtIndexPath.

Une idée?

+0

Peut-être que cela peut aider https://stackoverflow.com/questions/30405063/setting-cell-height-of-collectionview-doesnt-really-expand-cell- for-scrolling – ryantxr

+1

Vous ne devez pas mettre en file d'attente une cellule dans une fonction autre que cellForItemAt: 'Même si vous supprimez une cellule, vous n'aurez pas une cellule remplie avec les valeurs de ce chemin d'index. Vous devrez calculer des valeurs pour la hauteur en fonction des données de la cellule, ou utiliser une hauteur de cellule automatique et fournir une estimation de la taille de votre cellule – Paulw11

Répondre

0

sizeForItemAt est appelée avant que votre cell ne soit réellement créé et configuré avec les données requises. C'est la raison pour laquelle vous n'obtenez pas les données correctes dont vous avez besoin.

Essayez ceci:

Créer une dummy cell en sizeForItemAt par dequeuing depuis le collectionView. Configurez la cellule avec les données réelles que vous souhaitez afficher. Après avoir configuré l'obtenir les données dont vous avez besoin, à savoir

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
{ 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 
    //Configure your cell with actual data 
    cell.contentView.layoutIfNeeded() 
    //Calculate the size and return 
}