UITableView scrollt nach oben, wenn Zellen mit sich ändernden Zellenhöhen neu geladen werden

8

Ich habe eine Tabellenansicht, die Platzhalter enthält, während sie in Bilder geladen werden. Wenn das Bild geladen ist, rufe ich reloadRowsAtIndexPaths:withRowAnimation: auf. An diesem Punkt ändert die Zelle die Höhe, basierend auf der Größe des Bildes. Wenn das passiert, möchte ich, dass der Inhaltsversatz der Tabellenansicht an Ort und Stelle bleibt und die darunter liegenden Zellen weiter nach unten geschoben werden, wie Sie sich vielleicht vorstellen.

Der Effekt, den ich bekomme, ist, dass die Bildlaufansicht zurück nach oben scrollt. Ich bin nicht sicher, warum das so ist, und ich kann es anscheinend nicht verhindern. Das Setzen von beginUpdates() vor und endUpdates() nach der Zeile reloadRows hat keine Auswirkung.

Ich verwende estimatedRowHeight , wie es notwendig ist, da meine Tabellenansicht möglicherweise Hunderte von Zeilen unterschiedlicher Höhe haben kann. Ich implementiere auch tableView:heightForRowAtIndexPath: .

EDIT: Ich habe ein Demo-Projekt eingerichtet, um das zu testen, und zugegebenermaßen kann ich das Demo-Projekt nicht bekommen, um diesen Effekt zu reproduzieren. Ich werde weiter daran arbeiten.

    
Andrew 02.09.2015, 20:47
quelle

4 Antworten

11

Immer Aktualisiert die Benutzeroberfläche im Hauptthread . Also platziere einfach

%Vor%

in einem Hauptthread:

%Vor%     
Baig 13.11.2015, 10:45
quelle
27

Es ist ein Problem mit der geschätztenRowHeight.

Je mehr die geschätzteRowHeight von der tatsächlichen Höhe abweicht, desto mehr springt die Tabelle beim erneuten Laden, insbesondere beim Weiterblättern. Dies liegt daran, dass sich die geschätzte Größe der Tabelle radikal von der tatsächlichen Größe unterscheidet, sodass die Tabelle ihre Inhaltsgröße und ihren Offset anpassen muss.

Die einfachste Problemumgehung besteht darin, eine wirklich genaue Schätzung zu verwenden. Wenn die Höhe pro Zeile stark variiert, bestimmen Sie die mittlere Höhe für eine Zeile und verwenden Sie diese als Schätzung.

    
user4151918 02.09.2015 21:07
quelle
6

Ich hatte das gleiche Problem und entscheide auf diese Weise: Speichere Höhen von Zellen, wenn sie geladen werden und gib einen genauen Wert in tableView:estimatedHeightForRowAtIndexPath :

%Vor%     
Igor 02.08.2016 19:41
quelle
0

Ich sah dies und die Lösung, die für mich funktionierte, war, eine geschätzte Zeilenhöhe zu wählen, die die kleinste der möglichen Zeilen ist. Es war ursprünglich auf die größtmögliche Zeilenhöhe eingestellt worden, als das unbeabsichtigte Scrollen stattfand. Ich verwende nur die einzelne Eigenschaft tableView.estimatedRowHeight , nicht die Delegate-Methode.

    
jamone 04.01.2017 21:32
quelle

Tags und Links