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).
Ich würde folgendes vorschlagen:
- Fügen Sie Ihrer Sammlungsansicht eine Höhenbeschränkung hinzu.
- Stellen Sie die Priorität auf 999 ein.
- Setzen Sie die Konstante auf einen beliebigen Wert, der sie nur im Storyboard sichtbar macht.
- Ändern Sie die unterste Gleichheitsbeschränkung der Sammlungsansicht in größer oder gleich.
- Verbinden Sie die Höhenbeschränkung mit einer Steckdose.
- 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.
Ich endete, indem ich die UICollectionView
subclassing und einige Methoden wie folgt überschreibe.
self.collectionViewLayout.collectionViewContentSize
für intrinsicContentSize
wird sichergestellt, dass immer die richtige Größe angezeigt wirdreloadData
)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.
Sie müssen die Höhenbeschränkung gleich der Inhaltsgröße einstellen
HeightConstraint.constant = collection.contentSize.height
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;
}
Mach folgendes.
UICollectionView
calendarBaseViewHeight
UICollectionView
height Variablerufen Sie die Funktion nach dem erneuten Laden der Sammlungsansicht auf
func resizeCollectionViewSize(){
calendarBaseViewHeight.constant = collectionView.contentSize.height
}
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))
}
}
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()
}
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
arbeite für mich
let heightRes = resCollectionView.collectionViewLayout.collectionViewContentSize.height
foodHeightConstrant.constant = height.advanced(by: 1 )
foodCollectionView.setNeedsLayout()
foodCollectionView.layoutIfNeeded()
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 )
Stellen Sie in Ihrem UICollectionView
Ihre Einschränkungen wie Trailing
, Leading
und Bottom
ein:
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.
Mein Code für DrawerCollectionView
, der als Sammlungsansicht festgelegt ist Custom Class
:
import UIKit
class DrawerCollectionView: UICollectionView {
override func didMoveToSuperview() {
super.didMoveToSuperview()
heightAnchor.constraint(equalToConstant: contentSize.height).isActive = true
}
}