Gelegentlich möchte ich nach oben scrollen, wenn ich "reloadData ()" auf "UITableView" mache. Das ist aber ziemlich nervig. .. .. Ich habe verschiedene Methoden ausprobiert, daher werde ich es als Memorandum schreiben.
Was ich tun möchte, ist "Ich möchte die Position neu laden + nach oben scrollen, wenn die Taste gedrückt wird"!
So (vorher wird unten angezeigt und danach wird neu geladen + von vorher nach oben gescrollt)
before | after |
---|---|
Die Tabelle ist eine gruppierte Tabelle, in der der in Letzter Artikel geschriebene Header verschwindet und angezeigt wird! (Vor dem Ausblenden des Headers, nach dem Anzeigen des Headers)
Es gibt setContetnOffset
und scrollToRow
, um die Tabelle nach oben zu scrollen, und ich denke, es gibt 4 Muster, je nachdem, ob Sie vor oder nach reloadData
scrollen.
Die Implementierung sieht so aus
//Muster 1 (setContentOffset vorwärts scrollen)
tableView.setContentOffset(.zero, animated: false)
tableView.reloadData()
//Muster 2 (scrollToRow vorwärts scrollen)
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
tableView.reloadData()
//Muster 3 (nach setContentOffset scrollen)
tableView.reloadData()
tableView.setContentOffset(.zero, animated: false)
//Muster 4 (scrollToRow und dann scrollen)
tableView.reloadData()
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
Das Ergebnis sieht so aus
Muster 1 | Muster 2 | Muster 3 | Muster 4 |
---|---|---|---|
Die Muster 1 und 4 (aber kein Bildlauf zur Kopfzeile, da es sich um eine Zeileneinstellung handelt) scheinen gut zu sein, aber die Muster 2 und 3 befinden sich auf halber Position. .. ..
Ich weiß nicht, was es ist, aber die Inhaltsgröße ist vorerst nicht festgelegt = Ich denke, dass das Ergebnis wie oben sein wird, da das Layout auf halbem Weg ist. Soll ich es "layoutIfNeeded ()" nennen? Also habe ich es wie folgt implementiert.
//Muster 1 (setContentOffset vorwärts scrollen)
tableView.setContentOffset(.zero, animated: false)
tableView.layoutIfNeeded()
tableView.reloadData()
//Muster 2 (scrollToRow vorwärts scrollen)
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
tableView.layoutIfNeeded()
tableView.reloadData()
//Muster 3 (nach setContentOffset scrollen)
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(.zero, animated: false)
//Muster 4 (scrollToRow und dann scrollen)
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
Das Ergebnis sieht so aus
Muster 1 | Muster 2 | Muster 3 | Muster 4 |
---|---|---|---|
Alle Muster sehen gut aus: tada:
Durch Aufrufen von "layoutIfNeeded ()" ist jedes Verhalten wie erwartet, aber nicht eindeutig! Es gibt kein Problem, wenn die Zellenhöhe fest ist, aber wenn die Zellenhöhe variabel ist, ist es ein wenig. .. .. : verwirrt:
Bereiten Sie die folgenden zwei Muster von Zellen vor.
Wenn ich die Verarbeitung von Ausführungsergebnis 2 versuche, sieht das Ergebnis folgendermaßen aus (Übrigens, wenn es kein "layoutIfNeeded" -Muster gibt, ist der Bildlauf mit Ausnahme von Muster 4 auf halber Strecke)
Muster 1 | Muster 2 | Muster 3 | Muster 4 |
---|---|---|---|
Anders als bei Muster 3 scheint es zu funktionieren: clap: Wahrscheinlich funktioniert Muster 3, wenn Sie mit tableView (_: definedHeightForRowAt :)
einen geeigneten Wert zurückgeben. Es wäre schön, wenn es zwei Muster gäbe, aber wenn hier ein automatisches Layout beteiligt wäre, wären verschiedene Höhenberechnungen mühsam. .. ..
In Bezug auf die Höhe der Zelle wurden im folgenden Artikel verschiedene Dinge sorgfältig beschrieben. Bitte beziehen Sie sich darauf (ich weiß nicht viel ...) Was sollte für rowHeight und geschätzteRowHeight von UITableView festgelegt werden?
Dieses Mal habe ich Folgendes gewählt, weil ich zum Header scrollen wollte, weil die Berechnung schwierig war. (Vielleicht ist es gut: v :)
//Muster 1 (setContentOffset vorwärts scrollen)
tableView.setContentOffset(.zero, animated: false)
tableView.layoutIfNeeded()
tableView.reloadData()
Die Bedienung ist wie folgt
Kommentar, aber es scheint, dass Sie die Bildlaufposition wie unten gezeigt von ".top" in ".bottom" ändern sollten: Tada:
tableView.reloadData()
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .bottom, animated: false)
Ich brauche nicht einmal "layoutIfNeeded" und ich denke, das ist das Beste: entspannt:
Die Kombination von "reloadData" und Scrollen nach oben ist weit verbreitet, aber was soll ich schließlich tun? Ich mache mir immer Sorgen. .. ..
Es scheint die folgende Methode zu geben.
iOS TableView reload and scroll top
Wenn Sie einen anderen guten Weg kennen, bringen Sie mir bitte bei: Raised_hands:
Recommended Posts