2017-06-28 4 views
4

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.

+0

Pouvez-vous essayer primordial viewDidLayoutSubviews – YaBoiSandeep

Répondre

1

Avez-vous une contrainte de format? systemLayoutSizeFitting ne fonctionne pas correctement en présence d'une contrainte de format.

d'abord, essayez de définir la contrainte de hauteur au lieu de rapport d'aspect sur l'image et si cela fonctionne, réglez la contrainte de hauteur constante = Image.Width * 1.33 dans le code

+0

Voilà comment je l'ai fixé mais Je n'aime pas que je doive le faire moi-même et appeler layoutIfNeeded() parce que j'ai aussi des problèmes de performance et que je voudrais l'éviter. –

+0

Pouvez-vous fournir plus de détails sur systemLayoutSizeFitting ne fonctionne pas correctement avec le ratio d'aspect? Avez-vous et des références? –

+0

@ NunoGonçalves En fait, c'est un problème fréquent. La méthode systemLayoutSize utilise intrinsicContentSize pour calculer la hauteur, si vous ne définissez pas la contrainte de hauteur. Voici une autre solution à ce problème https://stackoverflow.com/questions/25664716/uiview-aspect-ratio-confuses-systemlayoutsizefittingsize – iamirzhan