wake-up-neo.com

Wie kann man die Höhe von UICollectionView an die Höhe der Inhaltsgröße von UICollectionView anpassen?

Ich möchte, dass die UICollectionView (die rote) in diesem Fall auf UCollectionViewCells (die gelben) auf die Höhe der Inhaltsgröße verkleinert wird, da viel Platz vorhanden ist. Was ich versucht habe, ist zu verwenden:

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 kehrt immer zurück (width, 0) und verkleinert sich daher zu sehr auf den Wert von Höhe 30 (der Wert, den ich in der Xib-Datei für die Höhe eingestellt habe, obwohl ich constaint = 30 habe).

 enter image description here

35
charbinary

Ich würde folgendes vorschlagen:

  1. Fügen Sie Ihrer Sammlungsansicht eine Höhenbeschränkung hinzu.
  2. Stellen Sie die Priorität auf 999 ein.
  3. Setzen Sie die Konstante auf einen beliebigen Wert, der sie nur im Storyboard sichtbar macht.
  4. Ändern Sie die unterste Gleichheitsbeschränkung der Sammlungsansicht in größer oder gleich.
  5. Verbinden Sie die Höhenbeschränkung mit einer Steckdose.
  6. Gehen Sie folgendermaßen vor, wenn Sie die Daten in der Sammlungsansicht neu laden:

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 Sie es verstehen. offensichtlich!!

Die Benutzeroberfläche versucht, alle Einschränkungen unabhängig von ihren Prioritäten zu berücksichtigen. Da die Höhenbeschränkung eine niedrigere Priorität von (999) hat und eine untere Einschränkung des Typs größer oder gleich ist. Immer, wenn die Konstante für die Höhenbeschränkung auf einen Wert festgelegt wird, der unter der Höhe der übergeordneten Ansicht liegt, entspricht die Auflistungsansicht der angegebenen Höhe, wodurch beide Einschränkungen erreicht werden.

Wenn jedoch die Konstante für die Höhenbeschränkung auf einen Wert festgelegt wird, der über der Höhe der übergeordneten Ansicht liegt, können beide Einschränkungen nicht erreicht werden. Daher wird nur die Einschränkung mit der höheren Priorität erreicht, die die größere oder gleiche untere Beschränkung ist.

Das Folgende ist nur eine Vermutung aus einer Erfahrung. So erreicht es einen Constranten. Es wird jedoch auch versucht, den error in der resultierenden Benutzeroberfläche für die andere nicht erreichte niedrigere Prioritätsbedingung so niedrig wie möglich zu machen . Daher entspricht die Höhe der Sammlungsansicht der Größe der übergeordneten Ansicht.

82
hasan

Ich endete, indem ich die UICollectionView subclassing und einige Methoden wie folgt überschreibe.

  • Durch die Rückgabe von self.collectionViewLayout.collectionViewContentSize für intrinsicContentSize wird sichergestellt, dass immer die richtige Größe angezeigt wird
  • Dann rufen Sie es einfach an, wenn es sich ändern könnte (wie bei reloadData)

Code:

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

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

Beachten Sie jedoch, dass Sie die "Zellwiederverwendung" verlieren, wenn Sie große Datensätze anzeigen, obwohl sie nicht auf den Bildschirm passen.  

9
d4Rk

Sie müssen die Höhenbeschränkung gleich der Inhaltsgröße einstellen

HeightConstraint.constant = collection.contentSize.height 
5
Bhanupriya

1) Legen Sie die Fixhöhe Ihrer CollectionView fest.

2) Erstellen Sie einen Auslass dieser CollectionViewView Height Constant . Mögen : 

IBOutlet NSLayoutConstraint * constHeight;

3) Fügen Sie die folgende Methode in Ihre .m-Datei ein:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    CGFloat height = collectionMenu.collectionViewLayout.collectionViewContentSize.height;
    constHeight.constant = height;
}
4
Parth Patel

Mach folgendes.

  1. setze zuerst die Höhenbeschränkung für UICollectionView
  2. hier ist calendarBaseViewHeightUICollectionView height Variable
  3. rufen Sie die Funktion nach dem erneuten Laden der Sammlungsansicht auf

    func resizeCollectionViewSize(){  
           calendarBaseViewHeight.constant = collectionView.contentSize.height      
     }
    
3
parthiban

Ich habe die Lösung von d4Rk übernommen, was großartig ist, außer in meinem Fall würde dies den unteren Teil meiner Sammlungsansicht (zu kurz) abschneiden. Ich habe herausgefunden, dass dies daran lag, dass die Größe des intrinsischen Inhalts manchmal 0 war und dies die Berechnungen zunichte machte. IDK. Ich weiß nur, dass dies behoben wurde.

import UIKit

class SelfSizedCollectionView: UICollectionView {
    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }

    override var intrinsicContentSize: CGSize {
        let s = self.collectionViewLayout.collectionViewContentSize
        return CGSize(width: max(s.width, 1), height: max(s.height,1))
    }

}
1
n13

In Swift 5 und Xcode 10.2.1

1) Fixe Höhe des CollectionView

2) Erstellen Sie ein Outlet Ihres CollectionView

IBOutlet weak var myCollectionViewHeight: NSLayoutConstraint!

3) Verwenden Sie den folgenden Code

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = myCollectionView.collectionViewLayout.collectionViewContentSize.height
    myCollectionViewHeight.constant = height
    self.view.layoutIfNeeded()
}
1
iOS

berechnen Sie zuerst die Anzahl der Zellen, multiplizieren Sie sie mit der Zellenhöhe und geben Sie dann die Höhe in dieser Methode zurück

    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
1
matloob Hasnain

arbeite für mich

    let heightRes = resCollectionView.collectionViewLayout.collectionViewContentSize.height
    foodHeightConstrant.constant = height.advanced(by: 1 )

    foodCollectionView.setNeedsLayout()
    foodCollectionView.layoutIfNeeded()
0
peyman jani

Holen Sie sich die Höhe der Zelle. Etwas wie das

let cellHeight = cell.frame.height

Abrufen des Ursprungs der Sammlungsansicht

let cvOrigin = collectionView.frame.Origin

Ruft die Breite der Sammlungsansicht ab

let cvWidth = collectionView.bounds.width

Stellen Sie den Rahmen der Inhaltsansicht ein

collection.frame = CGRect(x: cvOrigin.x, y: cvOrigin.y, width: cvWidth, height: cellHeight )
0
aphoe

Stellen Sie in Ihrem UICollectionView Ihre Einschränkungen wie Trailing, Leading und Bottom ein:

UICollectionView constraints

Wenn Sie sich meine Größenbeschränkung genauer ansehen, da sie nur für das Storyboard-Aussehen gedacht ist, damit ich keine Fehler erhalte, muss ich sie Remove at build time. Die reale Höhenbeschränkung ist in meinem Code unten festgelegt.

UICollectionView height constraint

Mein Code für DrawerCollectionView, der als Sammlungsansicht festgelegt ist Custom Class:

UICollectionView custom class

import UIKit

class DrawerCollectionView: UICollectionView {

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        heightAnchor.constraint(equalToConstant: contentSize.height).isActive = true
    }
}
0
George_E