135 votes

Comment déterminer la hauteur de UICollectionView avec FlowLayout ?

J'ai un UICollectionView avec un UICollectionViewFlowLayout et je veux calculer la taille de son contenu (pour le retour en intrinsicContentSize nécessaire pour ajuster sa hauteur via AutoLayout).

Les problèmes sont : Même si j'ai une hauteur fixe et égale pour toutes les cellules, je ne sais pas combien de "rangées"/lignes j'ai dans le tableau de bord. UICollectionView . Je ne peux pas non plus déterminer ce nombre par le nombre d'éléments de ma source de données, puisque les cellules représentant les éléments de données varient en largeur, et donc le nombre d'éléments que j'ai dans une ligne de l'écran. UICollectionView .

Comme je n'ai pas trouvé d'indications à ce sujet dans la documentation officielle et que la recherche sur Internet ne m'a pas permis d'aller plus loin, toute aide ou idée serait très appréciée.

1voto

Joshua Hart Points 533

Version Swift de @user1046037 :

public class DynamicCollectionView: UICollectionView {

    override public func layoutSubviews() {
        super.layoutSubviews()
        if !bounds.size.equalTo(intrinsicContentSize) {
            invalidateIntrinsicContentSize()
        }
    }

    override public var intrinsicContentSize: CGSize {
        let intrinsicContentSize: CGSize = contentSize
        return intrinsicContentSize
    }
}

0voto

Andrew Kirna Points 86

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 la vue de ma collection. Tout d'abord, j'utilisais une contrainte de mise en page automatique relative à la moitié de la hauteur de la vue principale. Pour résoudre ce problème, j'ai modifié la contrainte pour qu'elle soit relative à la "zone sûre" de la vue.

Cela m'a permis de définir la hauteur de la cellule pour remplir la vue de ma collection en utilisant collectionView.contentSize.height :

private func setCellSize() {
    let height: CGFloat = (collectionView.contentSize.height) / CGFloat(numberOfRows)
    let width: CGFloat = view.frame.width - CGFloat(horizontalCellMargin * 2)

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: width, height: height)
}

Avant

height constraint relative to superview bad simulator result

Après

height constraint relative to safe area good simulator result

0voto

En supposant que votre collectionView est nommée comme collectionView vous pouvez prendre la hauteur comme suit.

let height = collectionView.collectionViewLayout.collectionViewContentSize.height

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X