Ich möchte, dass die UICollectionView (die rote) auf die Höhe der Inhaltsgröße verkleinert wird, in diesem Fall die UICollectionViewCells (die gelben), da viel Leerraum 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
immer zurückgeben (Breite, 0) und aus diesem Grund schrumpft es zu stark auf den Wert von Höhe 30 (Der Wert, den ich in der XIB-Datei für die Höhe festgelegt habe, obwohl ich Konstante> = 30 habe).
ios
swift
uicollectionview
nslayoutconstraint
ios-autolayout
charbinary
quelle
quelle
heightConstraint.constant = collectionView.contentSize.height
Antworten:
Ich würde folgendes vorschlagen:
Möglicherweise möchten Sie auch den Einschub der Sammlungsansicht berücksichtigen, indem Sie ihn zur Inhaltsgröße hinzufügen.
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 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. Wenn die Höhenbeschränkungskonstante auf einen Wert festgelegt wird, der kleiner als die Höhe der übergeordneten Ansicht ist, entspricht die Sammlungsansicht der angegebenen Höhe, wodurch beide Einschränkungen erreicht werden.
Wenn die Höhenbeschränkungskonstante jedoch 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 Einschränkung ist.
Das Folgende ist nur eine Vermutung aus einer Erfahrung. So erreicht es eine Konstrante. Es wird jedoch auch versucht, den Fehler in der resultierenden Benutzeroberfläche für die andere nicht erreichte Einschränkung mit niedrigerer Priorität so niedrig wie möglich zu halten . Daher entspricht die Höhe der Sammlungsansicht der Größe der übergeordneten Ansicht.
quelle
1) Stellen Sie die feste Höhe Ihrer CollectionView ein.
2) Erstellen Sie einen Ausgang dieser CollectionView-Höhenkonstante. Mögen :
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; }
quelle
Swift 5
undXcode 10.2.1
. Vielen Dank.Am Ende habe ich die
UICollectionView
folgenden Methoden in Unterklassen unterteilt und einige Methoden überschrieben.self.collectionViewLayout.collectionViewContentSize
für zurückkehren, stellen SieintrinsicContentSize
sicher, dass Sie immer die richtige Größe habenreloadData
)Code:
override func reloadData() { super.reloadData() self.invalidateIntrinsicContentSize() } override var intrinsicContentSize: CGSize { return self.collectionViewLayout.collectionViewContentSize }
Beachten Sie jedoch, dass Sie die "Wiederverwendung von Zellen" verlieren, wenn Sie große Datenmengen anzeigen, obwohl diese nicht auf den Bildschirm passen.
quelle
UICollectionView
anfängliche Größe des Inhalts festzulegen. Wenn sich der Inhalt jedoch ändert, z. B.: Zeilen einfügen oder löschen, wird die Größe nicht geändert. Und wenn ich Daten neu laden aufrufe, ruckelt die Sammlungsansicht beim Ändern der Größe. Wie kann man dieses Stottern stoppen?self.invalidateIntrinsicContentSize()
ohne anzurufenreloadData()
? Vielleicht könnte das funktionieren.Sie müssen die Höhenbeschränkung gleich der Inhaltsgröße festlegen
HeightConstraint.constant = collection.contentSize.height
quelle
In Swift 5 und Xcode 10.2.1
Höhe der CollectionView korrigieren
Erstellen Sie ein Outlet Ihrer CollectionViewHeight
IBOutlet weak var myCollectionViewHeight: NSLayoutConstraint!
Verwenden Sie den folgenden Code
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let height = myCollectionView.collectionViewLayout.collectionViewContentSize.height myCollectionViewHeight.constant = height self.view.layoutIfNeeded() }
quelle
Dies schien mir die einfachste Lösung zu sein.
class SelfSizingCollectionView: UICollectionView { override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { super.init(frame: frame, collectionViewLayout: layout) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } private func commonInit() { isScrollEnabled = false } override var contentSize: CGSize { didSet { invalidateIntrinsicContentSize() } } override func reloadData() { super.reloadData() self.invalidateIntrinsicContentSize() } override var intrinsicContentSize: CGSize { return contentSize } }
Möglicherweise müssen Sie nicht überschreiben
reloadData
quelle
Folgen Sie den Anweisungen.
UICollectionView
calendarBaseViewHeight
ist dieUICollectionView
Höhe variabelRufen Sie die Funktion auf, nachdem Sie die Sammlungsansicht neu geladen haben
func resizeCollectionViewSize(){ calendarBaseViewHeight.constant = collectionView.contentSize.height }
quelle
Ich habe die Lösung von d4Rk übernommen, was großartig ist, außer in meinem Fall würde sie den unteren Rand meiner Sammlungsansicht immer wieder abschneiden (zu kurz). Ich fand heraus, dass dies daran lag, dass die intrinsische Inhaltsgröße manchmal 0 war und dies die Berechnungen beeinträchtigte. 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)) } }
quelle
Berechnen Sie zunächst die Anzahl der Zellen, multiplizieren Sie sie dann mit der Höhe der Zelle und geben Sie dann bei dieser Methode die Höhe 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
quelle
- -
class ContentSizedCollectionView: UICollectionView { override var contentSize:CGSize { didSet { invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { layoutIfNeeded() return CGSize(width: UIView.noIntrinsicMetric, height: collectionViewLayout.collectionViewContentSize.height) } }
quelle
Auf Ihrer
UICollectionView
Ihre Einschränkungen wie eingestelltTrailing
,Leading
undBottom
:Wenn Sie sich meine Höhenbeschränkung genauer ansehen, da es sich nur um ein Storyboard handelt, damit ich keine Fehler bekomme, muss ich es tun
Remove at build time
. Die tatsächliche Höhenbeschränkung ist in meinem Code unten festgelegt.Mein Code für
DrawerCollectionView
, der als Sammlungsansicht festgelegt istCustom Class
:import UIKit class DrawerCollectionView: UICollectionView { override func didMoveToSuperview() { super.didMoveToSuperview() heightAnchor.constraint(equalToConstant: contentSize.height).isActive = true } }
quelle
arbeite für mich
let heightRes = resCollectionView.collectionViewLayout.collectionViewContentSize.height foodHeightConstrant.constant = height.advanced(by: 1 ) foodCollectionView.setNeedsLayout() foodCollectionView.layoutIfNeeded()
quelle
Holen Sie sich die Höhe der Zelle. Etwas wie das
let cellHeight = cell.frame.height
Holen Sie sich den Ursprung der Sammlungsansicht
let cvOrigin = collectionView.frame.origin
Ruft die Breite der Sammlungsansicht ab
let cvWidth = collectionView.bounds.width
Legen Sie den Rahmen der Inhaltsansicht fest
collection.frame = CGRect(x: cvOrigin.x, y: cvOrigin.y, width: cvWidth, height: cellHeight )
quelle
Wenn Sie die Höhenbeschränkung der Sammlungsansicht festlegen. Beobachten Sie einfach die
contentSize
Änderung in viewDidLoad und aktualisieren Sie die Einschränkung.self.contentSizeObservation = collectionView.observe(\.contentSize, options: [.initial, .new]) { [weak self] collectionView, change in guard let `self` = self else { return } guard self.collectionView.contentSize != .zero else { return } self.collectionViewHeightLayoutConstraint.constant = self.collectionView.contentSize.height }
quelle