Ça me rend fou! J'ai un UICollectionViewController comme indiqué ci-dessous:
class PhrasesCompactCollectionViewController: UICollectionViewController
Les numberOfSections et cellForItemAt sont appelés mais le sizeForItemAtIndexPath n'est jamais appelé. J'utilise le même code exact ailleurs et il se déclenche correctement. J'utilise Xcode 8 Beta 6.
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 120, height:120)
}
Dans Swift 3+, utilisez cette méthode:
Assurez-vous que votre classe respecte les deux
UICollectionViewDelegate
UICollectionViewDelegateFlowLayout
la source
UICollectionViewDelegate
comme le fait déjà UICollectionViewController.J'ai eu le même problème. La seule chose qui m'a aidé a été de faire la «Taille estimée» pour la Taille de la cellule sous l'inspecteur de taille de collectionView «Aucune».
la source
sizeForItemAt
n'ont pas mentionné cela. Très utile.sizeForItemAt
fonctionnait bien jusqu'à Xcode 11.4 lorsque soudainement les cellules n'avaient pas la largeur. J'ai essayé un tas de choses et cela a finalement fonctionné.Swift 3
Pour définir la taille de cellule de UICollectionView, vous devez créer et personnaliser l'objet de
UICollectionViewFlowLayout
. Personnalisez les propriétés et définissez cet objet de mise en page sur l'objet UICollectionView.Modifiez les objets cellheight et cell cellWidth en fonction de vos besoins (la hauteur et la largeur de cellule souhaitées).
Assurez-vous: si vous avez ajouté la méthode sizeForItemAt indexPath, vous devez SUPPRIMER la méthode ...
la source
Swift 5
Toutes ces étapes sont nécessaires :
UICollectionViewDelegate, UICollectionViewDataSource
collectionView.delegate = self
etcollectionView.dataSource = self
comme:
la source
La première classe doit être confirmée à UICollectionViewDelegateFlowLayout. Ensuite, vous devez écrire le code suivant dans viewDidLoad ():
// Pour dire à UICollectionView d'utiliser les méthodes UICollectionViewDelegateFlowLayout de votre UIViewController
// Si vous souhaitez définir votre propre disposition de flux de vue de collection
En utilisant ce code méthode UICollectionViewDelegateFlowLayout
sera appelé, vous pouvez définir la taille dans cette méthode.
la source
Trois choses que vous devez vérifier si aucune réponse ne fonctionne:
Implémenter le délégué FlowLayout:
class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Utilisez la méthode pour la taille de l'article pour swift 3.0+:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }
Sélectionnez
Estimate size = None
dans l'élément Inspect de UICollectionView.la source
J'ai eu le même problème et rien ne le résoudrait. J'avais un avertissement jaune disant de le rendre privé car il se rapprochait d'une autre fonction définie par le délégué à la mise en page. Ce qui a résolu le problème pour moi était:
Notez la différence entre «sizeForItemAtIndexPath» et «sizeForItemAt» correct.
Je me suis arraché les cheveux pendant des jours en essayant de comprendre cela et cela a finalement fonctionné. Ci-dessous, je vais inclure toutes mes fonctions pour vous montrer comment j'ai également "caché" une cellule en rendant la hauteur égale à 0.
la source
J'ai eu ce problème la nuit dernière. Finalement résolu à minuit quand j'ai réalisé que la méthode 'didSelectItemAtIndex' n'était pas fermée avec un crochet de fermeture "}"
J'ai ajouté un crochet de fermeture tout en bas de la classe à la demande de l'erreur de compilation. Donc, en fait, toutes les méthodes ci-dessous 'didSelectItemAtIndex' étaient à l'intérieur de cette méthode.
Publier ici juste au cas où quelqu'un d'autre gaspillerait 4 heures de ses soirées sur celui-ci :-(
la source
Assurez-vous de mettre ceci dans viewDidLoad ()
la source
mon problème était que mon objet UICollectionViewDataSource était créé en tant que variable locale. Donc, si vous initialisez votre objet dataSource manuellement dans le code, assurez-vous de le stocker en tant que variable globale.
la source
Utilisez cette méthode
Au lieu de
la source
Ajoutez simplement: UICollectionViewDelegateFlowLayout
la source
Pour moi (dans Swift 3.1), la méthode doit être déclarée publique comme ceci:
N'oubliez pas de le rendre public .
la source
public
est ce que vous utilisez pour rendre votre code accessible entre les frameworks et les modules.