110 votes

Comment ajuster la hauteur de UICollectionView afin qu'elle corresponde à la taille du contenu de UICollectionView?

Je voudrais que le UICollectionView (la rouge) pour réduire la hauteur de la taille du contenu, dans ce cas UICollectionViewCells(jaune) car il y a beaucoup d'espace vide. Ce que j'ai tenté d'utiliser:

override func layoutSubviews() {
    super.layoutSubviews()
    if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
        self.invalidateIntrinsicContentSize()
    }
}

override var intrinsicContentSize: CGSize {
    return self.collection.contentSize
}

mais return self.collection.contentSize toujours de retour (largeur, 0) et pour cette raison, il se rétrécit trop à hauteur de 30 (la valeur que j'ai mis dans le fichier xib pour la hauteur, bien que j'ai constaint >= 30).

enter image description here

205voto

hasan Points 4225

Je vous suggère les points suivants:

  1. Ajouter une hauteur de contrainte à votre collection de point de vue.
  2. Définissez la priorité à 999.
  3. Définir sa constante à une valeur qui fait qu'il est raisonnablement visible sur la table de montage séquentiel.
  4. Changez le fond de l'égalité contrainte de la collection en vue d'une plus grande ou égale.
  5. Connecter la hauteur de la contrainte à une prise de courant.
  6. Chaque fois que vous rechargez les données sur l'affichage de la collection procédez de la manière suivante:

Exemple De Code:

CGFloat height = myCollectionView.collectionViewLayout.collectionViewContentSize.height
heightConstraint.constant = height
self.view.setNeedsLayout() Or self.view.layoutIfNeeded()

Explication: Extra, Vous n'avez pas à le lire si vous le comprenez. évidemment!!

L'INTERFACE utilisateur va essayer de réfléchir à toutes les contraintes n'importe quelles sont leurs priorités. Depuis la hauteur de la contrainte a une priorité plus faible de (999), et un fond de contrainte de type supérieur ou égal. à chaque fois, la hauteur de contrainte constante est définie à une valeur inférieure à la vue parent hauteur de l'affichage de la collection sera égale à la hauteur donnée, l'atteinte de ces deux contraintes.

Mais, lorsque la hauteur de contrainte constante définie sur une valeur supérieure à la vue parent de la hauteur à la fois des contraintes ne peuvent pas être atteints. Par conséquent, seule la contrainte de priorité la plus élevée sera réalisé, qui est la plus grande ou égale à fond de contrainte.

Ce qui suit est juste une supposition à partir d'une expérience. Donc, il réalise un constrant. Mais, il essaie aussi de faire l' erreur dans l'INTERFACE utilisateur de l'onu-a réussi à réduire la priorité de contrainte comme la plus faible possible. Par conséquent, l'affichage de la collection hauteur sera égale à la vue parent taille.

22voto

Parth Patel Points 157

1) Définissez la hauteur fixe de votre CollectionView.

2) Créer un point de vente de cette constante de hauteur CollectionView. Comme :

IBOutlet NSLayoutConstraint * constHeight;

3) Ajoutez la méthode ci-dessous dans votre fichier .m:

 - (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    CGFloat height = collectionMenu.collectionViewLayout.collectionViewContentSize.height;
    constHeight.constant = height;
}
 

20voto

d4Rk Points 4622

J'ai fini par sous-classer les UICollectionView et redéfinir certaines méthodes comme suit.

  • Renvoyer self.collectionViewLayout.collectionViewContentSize pour intrinsicContentSize garantit que vous aurez toujours la taille correcte
  • Ensuite, appelez-le chaque fois que cela pourrait changer (comme sur reloadData )

Code:

 override func reloadData() {
    super.reloadData()
    self.invalidateIntrinsicContentSize()
}

override var intrinsicContentSize: CGSize {
    return self.collectionViewLayout.collectionViewContentSize
}
 

Sachez toutefois que vous perdez la "réutilisation de cellules" si vous affichez de grands ensembles de données, même s’ils ne tiennent pas à l’écran.

9voto

Bhanupriya Points 652

Vous devez définir une contrainte de hauteur égale à la taille du contenu.

 HeightConstraint.constant = collection.contentSize.height 
 

3voto

parthiban Points 76

Faire suivre.

  1. contrainte de hauteur du premier ensemble pour UICollectionView
  2. ici calendarBaseViewHeight est UICollectionView hauteur Variable
  3. appeler la fonction après avoir rechargé la vue de collection

     func resizeCollectionViewSize(){  
           calendarBaseViewHeight.constant = collectionView.contentSize.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