Größen UITableViewCells automatisch ausleeren, bis reloadData aufgerufen wird

9

Ich habe eine Tableview-Zelle, deren View von einer Nib geladen wird und deren Subviews mit AutoLayout eingeschränkt sind. Ich benutze die Self-Sizing-Zellen-Funktion von iOS 8. Auf der ersten Anzeige sehen die Zellen wie folgt aus:

Der Abstand zwischen der grünen Ansicht und der blauen & amp; Graue Ansichten sind größer als ich erwartet habe. Wenn ich in der Ansicht nach unten blättere, damit mehr Zellen erstellt werden, oder wenn ich reloadData in der Tabellenansicht aufruft, bekomme ich das korrekte Ergebnis:

Es ist so, als ob die Unteransichten der Zellen bis zum zweiten Layout-Durchlauf nicht korrekt bemessen sind. Wie kann ich das umgehen? Ich habe einige Posts gesehen, die vorschlagen, dass setPreferredMaxLayoutWidth in layoutSubviews wie folgt gesetzt wird:

%Vor%

... aber es scheint keine Wirkung zu haben.

Es scheint keine Unklarheit in meinen Constraints zu geben, aber da sie in einer .nib angelegt sind, bin ich mir nicht sicher, wie ich sie hier veröffentlichen soll.

Bearbeiten 1:

Also habe ich den oberen Bereich der blau / grauen Ansichten auf & gt; = den unteren Rand der grünen Ansicht +3 gesetzt. Was ist das, was ich bekomme, da der Raum größer ist.

Wenn ich jedoch die Beziehung auf be == setze, erhalte ich einen anderen visuellen Fehler, bei dem die rote Beschriftung für die darin enthaltene Textmenge falsch dimensioniert ist:

Bearbeiten 2:

Ich bin mir nicht sicher, ob ich eine neue Frage beginnen soll, aber es ist das gleiche Problem.

Immer noch wiederkehrende Probleme mit dem Layout wie in Edit 1. Abgesehen von dem visuellen Problem, verursacht es einen schrecklichen Effekt, wenn sich eine einzelne Zelle in meiner Tabellenansicht ändert. Die gesamte Liste scheint zu kollabieren und neu zu laden. Außerdem erhalte ich folgenden automatischen Fehler:

%Vor%

Wo das UILabel steht, ist das längere, grüne Label. Es sieht so aus, als könne es die führenden und nachlaufenden Constraints nicht mit der Breite der Zelle abgleichen, als ob die Zelle insgesamt kleiner als 12 Punkte wäre. Das Ausloggen der Breite scheint jedoch immer 320 zu ergeben.

    
blork 21.09.2014, 20:04
quelle

3 Antworten

1

Nur um hinzuzufügen, da die meisten Leute Dinge vorgeschlagen haben, die für mich nicht funktionierten, hier ist, wie ich es behoben habe (für iOS 8). Ich benutze XIBs für Zellen, aber das sollte universell sein.

Zuerst gibt es einen Fehler bei UILabel, bei dem "- (void) layoutSubviews" nicht aufgerufen wird, sodass Sie die iOS 7.0-Lösung nicht wirklich für iOS 8 verwenden können. Daher verwende ich die automatische Zellengrößenanpassung für iOS 8.

Der oben beschriebene Fehler trat jedoch auf. Ich musste die Tabellenansicht neu laden, damit die Zellen korrekt waren. Wenn man sich Tutorials und Beispiele anschaut, gibt es eine Menge da draußen, die gut funktionieren, während andere sich beschweren, dass es Bugs gibt. Ich suchte nach dem gemeinsamen Nenner zwischen fehlerhaften und fehlerhaften Beispielen und der Fehler lautete: size-classes

Anstatt "compact-width" und "any-height" zu verwenden, verwenden Sie "any-any". Die Verwendung von "any-any" behebt alle Probleme und alles funktioniert wie erwartet. Klingt lächerlich, aber probier es aus!

    
kgaidis 22.10.2014 18:28
quelle
0

Könnte es sein, dass es kein Problem mit dem Layout ist, sondern mit der Berechnung der Zellenhöhe? Ich würde Ihren geschätztenHeightForRowAtIndexPath- oder heightForRowAtIndexPath-Wert überprüfen.

    
niklassaers 21.09.2014 20:23
quelle
0

Verwenden Sie das Debugging-Tool von Xcode 6, um festzustellen, ob es sich um ein Problem mit Ihren automatischen Layout-Einschränkungen handelt. Wenn Sie feststellen, dass dies nicht der Fall ist, könnte @niklassaers Recht haben.

    
Ste Prescott 21.09.2014 20:55
quelle

Tags und Links