In den Tabellenansichten von iOS8 stoßen Sie auf den Nebeneffekt einer fantastischen neuen Funktion: Automatische Zeilenhöhen.
In iOS 7 hatten Sie entweder Zeilen mit einer festen Größe (festgelegt mit tableView.rowHeight
), oder Sie haben Code geschrieben, um die Höhe Ihrer Zellen zu berechnen, und Sie haben diesen zurückgegeben tableView:heightForRowAtIndexPath
. Das Schreiben von Code zur Berechnung der Höhe einer Zelle kann sehr komplex sein, wenn Sie zahlreiche Ansichten in Ihrer Zelle hatten und unterschiedliche Höhen bei unterschiedlichen Schriftgrößen zu berücksichtigen hatten. Fügen Sie in Dynamic Type und der Prozess war ein Schmerz im Arsch.
In iOS 8 können Sie die oben genannten Schritte weiterhin ausführen. Jetzt kann die Höhe der Zeilen von iOS bestimmt werden, sofern Sie den Inhalt Ihrer Zelle mithilfe des automatischen Layouts konfiguriert haben. Dies ist ein großer Vorteil für Entwickler, da sich Ihre Benutzeroberfläche an die neue Größe anpassen kann, wenn sich die dynamische Schriftgröße ändert oder der Benutzer die Textgröße mithilfe der Eingabehilfeneinstellungen ändert. Wenn Sie über ein UILabel verfügen, das mehrere Textzeilen enthalten kann, kann Ihre Zelle jetzt vergrößert werden, um diese zu berücksichtigen, wenn die Zellen dies benötigen, und verkleinert werden, wenn dies nicht der Fall ist, sodass keine unnötigen Leerzeichen vorhanden sind.
Die angezeigte Warnmeldung weist Sie darauf hin, dass in Ihrer Zelle nicht genügend Einschränkungen für das automatische Layout vorhanden sind, um die Tabellenansicht über die Höhe der Zelle zu informieren.
Um die dynamische Zellenhöhe zu verwenden, die zusammen mit den bereits von anderen Postern erwähnten Techniken diese Meldung beseitigt, müssen Sie sicherstellen, dass Ihre Zelle über ausreichende Einschränkungen verfügt, um die UI-Elemente an den oberen und unteren Rand der Zelle zu binden . Wenn Sie zuvor das automatische Layout verwendet haben, sind Sie wahrscheinlich daran gewöhnt, Einschränkungen für Top + Leading festzulegen. Für die dynamische Zeilenhöhe sind jedoch auch Bottom-Einschränkungen erforderlich.
Der Layout-Durchlauf funktioniert so, dass er unmittelbar vor der Anzeige einer Zelle auf dem Bildschirm just-in-time ausgeführt wird:
Die Abmessungen für Inhalte mit Eigengrößen werden berechnet. Dies umfasst UILabels und UIImageViews, deren Abmessungen auf dem Text bzw. den darin enthaltenen UIImages basieren. In beiden Ansichten wird ihre Breite als bekannt angesehen (weil Sie Einschränkungen für Hinter- / Vorderkanten festgelegt oder explizite Breiten festgelegt oder horizontale Einschränkungen verwendet haben, die schließlich eine Breite von Seite zu Seite anzeigen). Angenommen, ein Etikett enthält einen Textabschnitt ("Anzahl der Zeilen" wird auf 0 gesetzt, damit es automatisch umbrochen wird). Es kann nur einen Durchmesser von 310 Punkten haben, sodass bei der aktuellen Schriftgröße eine Höhe von 120pt festgelegt wird.
Die Benutzeroberfläche richtet sich nach Ihren Positionierungsbeschränkungen. Am unteren Rand des Etiketts befindet sich eine Einschränkung, die mit dem unteren Rand der Zelle verbunden ist. Da das Etikett auf 120 Punkte angewachsen ist und durch die Einschränkung an den unteren Rand der Zelle gebunden ist, muss es die Zelle "nach unten" drücken (wodurch die Höhe der Zelle erhöht wird), um die Einschränkung zu erfüllen, die "unten von" lautet Das Etikett ist immer der Standardabstand vom unteren Rand der Zelle.
Die von Ihnen gemeldete Fehlermeldung tritt auf, wenn diese untere Einschränkung fehlt. In diesem Fall gibt es nichts, was den unteren Teil der Zelle vom oberen Rand der Zelle wegschieben könnte. Dies ist die Mehrdeutigkeit, die gemeldet wird: Es gibt nichts, von dem aus der untere Rand verschoben werden kann Oben bricht die Zelle zusammen. Das automatische Layout erkennt dies jedoch ebenfalls und verwendet wieder die Standardzeilenhöhe.
Wenn Sie die auf automatischem Layout basierenden dynamischen Zeilenhöhen von iOS 8 implementieren, sollten Sie diese implementieren, um eine abgerundete Antwort zu erhalten tableView:estimatedHeightForRowAtIndexPath:
. Diese Schätzmethode kann grobe Werte für Ihre Zellen verwenden und wird aufgerufen, wenn die Tabellenansicht zum ersten Mal geladen wird. Es hilft UIKit beim Zeichnen von Dingen wie der Bildlaufleiste, die nur gezeichnet werden können, wenn die Tabellenansicht weiß, durch wie viel Inhalt sie scrollen kann, aber keine absolut genauen Größen benötigt, da es sich nur um eine Bildlaufleiste handelt. Auf diese Weise kann die Berechnung der tatsächlichen Zeilenhöhe bis zu dem Zeitpunkt verschoben werden, an dem die Zelle benötigt wird. Dies ist weniger rechenintensiv und ermöglicht eine schnellere Darstellung Ihrer UITableView.