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.
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.
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.
Tags und Links objective-c uitableview ios