Fügen Sie Zeilen am oberen Rand von UITableView ein, ohne die Bildlaufposition zu ändern, wenn Sie UITableViewAutomaticDimension verwenden

8

Wie kann man Zeilen in ein UITableView ganz oben einfügen, ohne dass der Rest der Zellen nach unten gedrückt wird - so scheint sich die Bildlaufposition überhaupt nicht zu ändern.

Genau wie Facebook und Twitter, wenn neue Posts zugestellt werden, werden sie oben eingefügt, aber die Scroll-Position bleibt unverändert.

Meine Frage ist ähnlich wie diese diese Frage . Was meine Frage von dieser Frage unterscheidet, ist, dass ich keine Tabelle mit festen Zeilenhöhen verwende - ich verwende UITableViewAutomaticDimension und estimatedRowHeight . Daher werden die dort vorgeschlagenen Antworten nicht funktionieren, da ich die Zeilenhöhe nicht bestimmen kann.

Ich habe diese Lösung ausprobiert, bei der die Zeilenhöhe nicht berücksichtigt wird, aber die contentSize ist nach dem Neuladen immer noch nicht korrekt, weil die contentOffset Menge nicht die gleiche relative Position ist - die Zellen werden immer noch gedrückt vorbei, wo sie vor dem Einsatz waren. Das liegt daran, dass die Zelle nicht auf dem Bildschirm gerendert wurde, daher berechnet iOS die entsprechende Höhe nicht, bis es erscheint, daher ist contentSize nicht korrekt.

%Vor%

Alain wies auf rectForCellAtIndexPath hin, was iOS dazu zwingt, die passende Höhe zu berechnen. Ich kann jetzt die richtige Höhe für die eingefügten Zellen bestimmen, aber die contentSize der Bildansicht ist immer noch nicht korrekt, wie es sich zeigt, wenn ich über alle Zellen iteriere und die Höhen addiere, die größer ist als contentSize.height . Wenn ich also contentOffset manuell einstelle, scrollt es nicht zum richtigen Ort.

Ursprünglicher Code:

%Vor%

Was kann in diesem Szenario getan werden, um das gewünschte Verhalten zu erreichen?

    
Joey 12.01.2016, 00:14
quelle

4 Antworten

6

Bis zur Party, aber das funktioniert sogar, wenn Zellen dynamische Höhen haben (aka UITableViewAutomaticDimension ), keine Notwendigkeit, über Zellen zu iterieren, um ihre Größe zu berechnen, aber funktioniert nur, wenn Elemente ganz am Anfang der tableView und dort hinzugefügt werden ist kein Header, mit ein wenig Mathe ist es wahrscheinlich möglich, dies an jede Situation anzupassen:

%Vor%     
Ezechiele 27.08.2016 08:05
quelle
1

Auch einreihige Abschnitte können gewünschte Wirkung erreichen

  

Wenn ein Abschnitt bereits an der angegebenen Indexposition vorhanden ist, wird es eine Indexposition nach unten bewegt.    Ссылка :

%Vor%     
Loaf Box 13.07.2016 08:02
quelle
1

Löse das gleiche Problem und finde immer noch keinen eleganten Weg, es zu lösen. Hier ist mein Weg, angenommen, ich möchte moreData.count -Zellen über der aktuellen Zelle einfügen.

%Vor%

Der Vorteil ist die Position vor und nach dem Einfügen neuer Daten. Der Nachteil ist, dass wir den Bildschirm blinken sehen können (die oberste Zelle zeigt und bewegt sich nach oben)

    
Owen 23.08.2016 07:26
quelle
0

Ich denke, deine Lösung war fast da. Sie sollten den neuen Y-Offset auf den "vorher" Y-Offset und nicht auf den "nach" setzen.

..., beforeContentOffset.y + afterContentSize.height - beforeContentSize.height

(Sie müssen den beforeContentOffset-Punkt vor den Daten zum erneuten Laden speichern)

    
Alain T. 12.01.2016 02:50
quelle

Tags und Links