Variable Breite und Höhe von UICollectionViewCell mithilfe von AutoLayout mit Storyboard (ohne XIB)

Hier ist ein Designproblem in der App, das AutoLayout, UICollectionView und UICollectionViewCell verwendet und dessen Breite und Höhe abhängig von den AutoLayout-Einschränkungen und dem Inhalt (Text) automatisch geändert werden kann.

It ist eine UITableView-Liste, bei der jede Zelle ihre eigene Breite und Höhe hat und für jede Zeile abhängig vom Inhalt separat berechnet wird. Es ist eher so, als ob iOS-Nachrichten in einer App (oder in WhatsUp) erstellt werden.

s ist offensichtlich, dass die App von @ Gebrauch machen sollfunc collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize.

Issue ist, dass innerhalb dieser Methode die App nicht @ aufrufen kafunc collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell NochdequeueReusableCellWithReuseIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath!) -> AnyObject, um die Zelle zu instanziieren, mit bestimmten Inhalten zu füllen und ihre Breite und Höhe zu berechnen. Wenn Sie dies versuchen, führt dies zu unbestimmten Rekursionsaufrufen oder einem anderen Absturz der App (zumindest in iOS 8.3).

Die beste Möglichkeit, diese Situation zu beheben, besteht darin, die Definition der Zelle in die Ansichtshierarchie zu kopieren, damit das automatische Layout die Größe der "Zelle" automatisch ändert (z. B. hat die Zelle dieselbe Breite wie die übergeordnete Sammlungsansicht), sodass die App die Zelle mit bestimmten Inhalten konfigurieren kann und berechnen Sie seine Größe. Dies sollte definitiv nicht die einzige Möglichkeit sein, das Problem zu beheben, da die Ressourcen doppelt vorhanden sind.

All dies hängt mit der Einstellung von UILabel.preferredMaxLayoutWidth auf einen Wert zusammen, der vom Auto-Layout steuerbar (nicht fest codiert) sein sollte. Dies kann von der Bildschirmbreite und -höhe oder zumindest von der Auto-Layout-Einschränkungsdefinition abhängen, sodass die App mehrzeiliges UILabel erhalten kann Eigengröße berechnet.

Ich möchte keine Zellen aus XIB-Dateien instanziieren, da Storyboards der heutige Industriestandard sein sollten und ich weniger Eingriffe in Code haben möchte.

BEARBEITEN

Der Basiscode, der nicht ausgeführt werden kann, ist unten aufgeführt. Daher stürzt die App nur ab, wenn die Variable cellProbe instanziiert wird (nicht verwendet). Ohne diesen Aufruf läuft die App reibungslos.

var onceToken: dispatch_once_t = 0

class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        dispatch_once(&onceToken) {

            let cellProbe = collectionView.dequeueReusableCellWithReuseIdentifier("first", forIndexPath: NSIndexPath(forRow: 0, inSection: 0)) as! UICollectionViewCell
        }

        return CGSize(width: 200,height: 50)
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("first", forIndexPath: NSIndexPath(forRow: 0, inSection: 0)) as! UICollectionViewCell

        return cell
    }
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage