it-swarm.com.de

Automatische Größenänderung der UICollectionView-Höhe zur Anpassung an die Inhaltsgröße

Ich habe eine UICollectionView, eine Schaltfläche, die eine neue Zelle in der Sammlungsansicht erstellt. Und ich möchte, dass UICollectionView seine Größe entsprechend der Inhaltsgröße anpasst (wenn eine oder zwei Zellen vorhanden sind, ist UICollectionView kurz, wenn es viele Zellen gibt.

Ich weiß, wie man die Inhaltsgröße erhält: 

collectionView.collectionViewLayout.collectionViewContentSize

Aber ich weiß nicht, wo ich diesen Wert verwenden soll. Ich würde mich freuen, wenn mir jemand hilft, herauszufinden, wie UICollectionView seine Höhe automatisch anpasst.

UPD: Ich habe auf GitHub ein Demoprojekt veröffentlicht, das das Problem beschreibt: https://github.com/avokin/PostViewer

21
AVokin

Ich glaube nicht, dass Sie nach der Inhaltsgröße suchen. Ich denke, Sie möchten die Menge der von der Sammlungsansicht belegten Bildschirmfläche anpassen, oder? Dies erfordert eine Anpassung des Rahmens. Die Inhaltsgröße umfasst den Offscreen-Bereich (Bildlauf) sowie die Bildschirmansicht.

Ich kenne nichts, was Sie daran hindert, die Rahmengröße im laufenden Betrieb zu ändern:

collectionView.frame = CGRectMake (x,y,w,h);
[collectionView reloadData];

Wenn ich dich richtig verstehe.

6

Verwenden Sie eine Höhenbeschränkung für die Sammlungsansicht, und aktualisieren Sie den Wert bei Bedarf mit der Inhaltshöhe. Siehe diese Antwort: https://stackoverflow.com/a/20829728/3414722

6
sammalfix

Schritte zum Ändern des UICollectionView-Frames:

  1. Setzen Sie die Eigenschaft "translatesAutoresizingMaskIntoConstraints" auf YES, um den Überblick der Collectioview zu erhalten (wenn Sie AUTOLAYOUT verwenden)

  2. Aktualisieren Sie dann den Rahmen der Collectioview wie folgt:

    collectionView.frame = CGRectMake (x,y,w,h);
    [collectionView reloadData];
    
0
Shahul Hasan

Sie müssen die Höhe der Sammlungsansicht auf die Höhe Ihres Inhalts beschränken:

Ich verwende SnapKit im folgenden Code.

Beschränken Sie zunächst die Kanten der Sammlungsansicht auf ihren Superview:

private func constrainViews() {
    collectionView?.translatesAutoresizingMaskIntoConstraints = true

    collectionView?.snp.makeConstraints { make in
        make.edges.equalToSuperview()
        heightConstraint = make.height.equalTo(0).constraint
    }
}

Berechnen Sie als Nächstes die Höhe und setzen Sie die Höhe auf den Höhenbeschränkungsversatz. Ich lasse das Flow-Layout die Arbeit erledigen und berechne dann die Höhe basierend auf dem unteren Rand des letzten Layoutattributs:

override func viewDidLayoutSubviews() {
    guard
        let collectionView = collectionView,
        let layout = collectionViewLayout as? UICollectionViewFlowLayout
    else {
        return
    }

    let sectionInset = layout.sectionInset
    let contentInset = collectionView.contentInset

    let indexPath = IndexPath(item: tags.count, section: 0)
    guard let attr = collectionViewLayout.layoutAttributesForItem(at: indexPath) else {
        return
    }

    // Note sectionInset.top is already included in the frame's Origin
    let totalHeight = attr.frame.Origin.y + attr.frame.size.height
        + contentInset.top + contentInset.bottom
        + sectionInset.bottom

    heightConstraint?.update(offset: totalHeight)
}

Beachten Sie, dass ich im Beispiel immer ein spezielles Tag habe, das nicht in meinen Artikeln tagscount enthalten ist.

let indexPath = IndexPath(item: tags.count, section: 0)

müsste so etwas wie if items.count > 0 ... let indexPath = IndexPath(item: tags.count - 1, section: 0) in den meisten anderen Code sein.

0
emp