Pour toutes les solutions, notez qu'il n'est pas nécessaire d'appeler explicitement reloadData
en viewDidLoad
: cela se fera automatiquement.
Solution 1
Inspiré par L'idée de Samantha : invalidateLayout
de manière asynchrone dans viewDidLoad
.
override func viewDidLoad() {
super.viewDidLoad()
//[...]
for _ in 0 ..< 1000 {
array.append(randomKeyByBitLength(Int(arc4random_uniform(8)))!)
}
DispatchQueue.main.async {
self.collectionView.collectionViewLayout.invalidateLayout()
}
}
Solution 2
(imparfait, voir l'amélioration de DHennessy13 à ce sujet)
Sur la base de Réponse de Peter Lapisu . invalidateLayout
en viewWillLayoutSubviews
.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
collectionView.collectionViewLayout.invalidateLayout()
}
Comme l'a noté DHennessy13, cette solution actuelle avec viewWillLayoutSubviews
est imparfait car il invalideraLayout lors de la rotation de l'écran.
Vous pouvez suivre Amélioration DHennessy13 concernant cette solution.
Solution 3
Sur la base d'une combinaison de Réponse de Tyler Sheaffer , Portage de Shawn Aukstak chez Swift et l'idée de Samantha. Sous-classez votre CollectionView pour effectuer invalidateLayout
en layoutSubviews
.
class AutoLayoutCollectionView: UICollectionView {
private var shouldInvalidateLayout = false
override func layoutSubviews() {
super.layoutSubviews()
if shouldInvalidateLayout {
collectionViewLayout.invalidateLayout()
shouldInvalidateLayout = false
}
}
override func reloadData() {
shouldInvalidateLayout = true
super.reloadData()
}
}
Cette solution est élégante car elle ne nécessite pas de modifier le code de votre ViewController. Je l'ai implémentée sur la branche AutoLayoutCollectionView de cet exemple de projet. https://github.com/Coeur/StackOverflow51375566/tree/AutoLayoutCollectionView .
Solution 4
Réécriture des contraintes par défaut de UICollectionViewCell. Voir Réponse de Larry .
Solution 5
Mettre en œuvre collectionView(_:layout:sizeForItemAt:)
et retourner cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
. Voir réponse mate .
0 votes
Je ne parviens pas à reproduire le problème car les versions ios 11 et ios 12 produisent le même résultat.
1 votes
@PranavKasetti Je l'ai reproduit facilement dans Xcode 10 beta 6 en utilisant le code donné. J'ai mis un lien vers un exemple de projet dans la question pour plus de commodité.