J'ai un UICollectionView
avec un UICollectionViewFlowLayout
, et je veux calculer la taille de son contenu (pour le retour intrinsicContentSize
nécessaire pour ajuster sa hauteur via AutoLayout).
Le problème est: même si j'ai une hauteur fixe et égale pour toutes les cellules, je ne sais pas combien de "lignes" / lignes j'ai dans le fichier UICollectionView
. Je ne peux pas non plus déterminer ce nombre par le nombre d'éléments dans ma source de données, car les cellules représentant les éléments de données varient en largeur, de même que le nombre d'éléments que j'ai dans une ligne du UICollectionView
.
Comme je n'ai pas trouvé d'indices sur ce sujet dans la documentation officielle et que la recherche sur Google ne m'a pas amené plus loin, toute aide et idées seraient très appréciées.
la source
Si vous utilisez la mise en page automatique , vous pouvez créer une sous-classe de
UICollectionView
Si vous utilisez le code ci-dessous, vous n'avez pas à spécifier de contrainte de hauteur pour la vue de collection car elle varierait en fonction du contenu de la vue de collection.
Ci-dessous est la mise en œuvre:
la source
À
viewDidAppear
vous pouvez l'obtenir par:Peut-être que lorsque vous rechargez des données, vous devez calculer une nouvelle hauteur avec de nouvelles données, vous pouvez l'obtenir en: ajoutez un observateur pour écouter lorsque vos
CollectionView
données de rechargement ont terminé àviewdidload
:Ensuite, ajoutez la fonction ci-dessous pour obtenir une nouvelle hauteur ou faites quoi que ce soit après le rechargement de collectionview:
Et n'oubliez pas de supprimer l'observateur:
la source
user1046037 réponse dans Swift ...
la source
UILabel
ci-dessus, le contenu decollectionView
passer sur un autre élément ci-dessus, avez-vous une autre solution?Code SWIFT 3 pour la réponse de l'utilisateur1046037
la source
Swift 4
la source
Swift 4.2
la source
Il est trop tard pour répondre à cette question, mais je suis récemment passé par ce problème.
La réponse ci - dessus de @ lee m'aide beaucoup à obtenir ma réponse. Mais cette réponse se limite à l' objectif-c et je travaillais rapidement .
@lee En référence à votre réponse, permettez-moi de laisser l'utilisateur rapide résoudre ce problème facilement. Pour cela, veuillez suivre les étapes ci-dessous:
Déclarez une
CGFloat
variable dans la section déclaration:À
viewDidAppear
vous pouvez l'obtenir par:Peut-être que lorsque vous avez
reload
besoin de calculer une nouvelle hauteur avec de nouvelles données, vous pouvez l'obtenir par:addObserver
pour écouter lorsque vosCollectionView
données de rechargement ont terminé àviewWillAppear
:Ensuite, ajoutez la fonction ci-dessous pour obtenir une nouvelle hauteur ou faites quelque chose après le
collectionview
rechargement terminé:Et n'oubliez pas de supprimer l'observateur:
J'espère que cela vous aidera à résoudre votre problème rapidement.
la source
Cette réponse est basée sur @Er. La réponse de Vihar. Vous pouvez facilement implémenter la solution en utilisant RxSwift
la source
Version Swift de @ user1046037:
la source
Swift 4.2, Xcode 10.1, iOS 12.1:
Pour une raison quelconque,
collectionView.contentSize.height
apparaissait plus petit que la hauteur résolue de ma vue de collection. Tout d'abord, j'utilisais une contrainte de mise en page automatique relative à la moitié de la hauteur de la vue supervisée. Pour résoudre ce problème, j'ai changé la contrainte pour qu'elle soit relative à la "zone sûre" de la vue.Cela m'a permis de définir la hauteur de cellule pour remplir ma vue de collection en utilisant
collectionView.contentSize.height
:Avant
Après
la source
en supposant que votre collectionView est nommée collectionView, vous pouvez prendre la hauteur comme suit.
la source
De plus, vous feriez mieux d'appeler
reloadData
avant d'obtenir la hauteur:la source