J'utilise une disposition personnalisée pour un UICollectionView
. Ma cellule devrait avoir une largeur fixe et une hauteur flexible. La cellule est composée d'un UImageView
et d'un UIStackView
. Les contraintes de UIImageView
sont les suivantes:systemLayoutSizeFitting ignorant les contraintes de disposition et utilisant la taille intrinsèque de la vue d'image
image.top = cell.top
image.width = cell.width
image.height = image.width * 1.33
image.centerX = cell.centerX
image.bottom = stackView.top
La vue de la pile est similaire, et est en effet lié au fond de la cellule.
Lorsque le système appelle preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
Je suis d'effectuer des calculs pour obtenir la hauteur de la cellule.
let preferredAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)
let size = CGSize(width: layoutAttributes.frame.width,
height: UILayoutFittingCompressedSize.height)
let preferredSize = systemLayoutSizeFitting(size,
withHorizontalFittingPriority: .defaultHigh,
verticalFittingPriority: .fittingSizeLevel)
Il se trouve que la preferredSize est calculée en utilisant la taille imageView instrinsic plutôt que dans le respect des contraintes. Donc, pour une image avec 850x850 (et une cellule avec 160 points de largeur), je reçois une hauteur beaucoup plus élevée que ce à quoi je m'attends et donc une cellule avec un énorme espace au fond.
J'ai réussi à résoudre ce problème avec quelque chose que je sens comme si c'était un hack.
J'ai créé une référence à la contrainte de largeur de l'image, la mettre à jour lorsque j'appelle cette méthode avec la valeur fixe fournie par layoutAttributes et appeler setNeedsLayout() et layoutIfNeeded() et cela fonctionne. Mais je n'aime vraiment pas que je doive forcer la mise en page à refaire et mettre à jour la largeur moi-même, pour ne pas mentionner que je perds la performance.
Comment cela peut-il être amélioré?
Merci beaucoup.
Pouvez-vous essayer primordial viewDidLayoutSubviews – YaBoiSandeep