2017-02-24 2 views
14

Ich möchte, dass die UICollectionView (die rote) auf die Höhe der Inhaltsgröße in diesem Fall UICollectionViewCells (die gelben) schrumpfen, weil es viel leeren Platz gibt. Was habe ich versucht, verwenden:Wie wird die Höhe von UICollectionView auf die Höhe der Inhaltsgröße der UICollectionView eingestellt?

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

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

aber return self.collection.contentSize immer wieder zurückkehren (Breite, 0) und aus diesem Grund 30 auf den Wert der Höhe zu viel schrumpft (der Wert, den ich für die Höhe in der xib Datei! , obwohl ich constaint> = 30 habe).

enter image description here

+0

die Sammlung Ansicht neu zu laden Sie haben Höhenbeschränkung Steckdose nehmen von ColletionView und stellen Sie die Höhe wie folgt ein: 'heightConstraint.constant = collectionView.contentSize.height' –

+0

Verwenden Sie ein benutzerdefiniertes Layout oder das von Apple bereitgestellte UICollectionViewFlowLayout? –

+0

Ich benutze die Standard-UICollectionViewFlowLayout – charbinary

Antwort

32

Ich würde vorschlagen, die folgend:

  1. Fügen Sie Ihrer Sammlungsansicht eine Höhenbeschränkung hinzu.
  2. Setzen Sie die Priorität auf 999.
  3. Setzen Sie die Konstante auf einen Wert, der sie nur auf dem Storyboard sichtbar macht.
  4. Ändern Sie die untere Gleichheitsbedingung der Sammlungsansicht auf größer oder gleich.
  5. Verbinden Sie die Höhenbeschränkung mit einer Steckdose.
  6. Jedes Mal, wenn die Daten über die Sammlung Ansicht nachladen wie folgt vor:

Codebeispiel:

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

Erläuterung: Extra, Sie müssen nicht lesen, wenn Du verstehst es. offensichtlich!!

Die Benutzeroberfläche wird versuchen, alle Einschränkungen widerzuspiegeln, unabhängig von ihren Prioritäten. Da die Höhenbeschränkung eine niedrigere Priorität von (999) und eine untere Einschränkung vom Typ größer oder gleich hat. Wann immer die Konstante für die Höheneinschränkung auf einen Wert kleiner als die Höhe der übergeordneten Ansicht festgelegt wird, entspricht die Ansicht der Sammlung der angegebenen Höhe, wodurch beide Einschränkungen erreicht werden.

Wenn jedoch die Constraint-Konstanten auf einen höheren Wert als die Höhe der Parent-View gesetzt ist, können beide Constraints nicht erreicht werden. Daher wird nur die Beschränkung mit der höheren Priorität erreicht, die die größere oder gleiche untere Einschränkung ist.

Das folgende ist nur eine Vermutung von einer Erfahrung. Also, es erreicht eine Beschränkung. Aber es versucht auch, den Fehler in der resultierenden UI für die andere nicht erreichte Einschränkung mit niedrigerer Priorität so niedrig wie möglich zu machen. Daher entspricht die Höhe der Sammlungsansicht der Größe der übergeordneten Ansicht.

+1

perfekte Antwort vielen Dank !!! – karenms

+0

@ hasan83, bro können Sie bitte einen Blick auf mein Problem https://stackoverflow.com/questions/46034278/how-to-adjust-uiview-height-according-to-the-collection-view-content-height- in-s? noredirect = 1 # comment79054393_46034278? –

+0

Mine erweitert sich in gewissem Maße, aber nicht perfekt. Es fehlen etwa 3 4 Zeilen des Etiketts. Irgendeine Idee? So sieht es aus: https://ibb.co/jeO9Rv https://ibb.co/iV8b6v – Nil

0

allererste Berechnung der Anzahl der Zellen, als es der Zelle mit der Höhe multiplizieren und dann Höhe Rückkehr in dieser Methode

collectionView.frame = CGRectMake (x,y,w,collectionView.collectionViewLayout.collectionViewContentSize.height); //objective c 
    //[collectionView reloadData]; 
    collectionView.frame = CGRect(x: 0, y: 0, width: width, height: collectionView.collectionViewLayout.collectionViewContentSize.height) // swift 
+0

Diese Methode gibt die Größe für eine bestimmte Zelle im Indexpfad zurück. Wenn Sie die Höhe auf noOfCell * heightOfCell setzen, wird die Höhe aller Zellen festgelegt. –

+0

@Georgi Boyadzhiev, das ist wahr. – charbinary

3

Sie müssen Höhenbeschränkung als gleich Inhalt Größe

HeightConstraint.constant = collection.contentSize.height 
1

folgenden Maßnahmen gesetzt.

  1. ersten Satz Höhe begrenzen für UICollectionView
  2. hier calendarBaseViewHeight ist UICollectionView Höhe Variabel
  3. Anruf nach der Funktion

    func resizeCollectionViewSize(){ 
         calendarBaseViewHeight.constant = collectionView.contentSize.height  
    } 
    
Verwandte Themen