[SWIFT] Ich möchte die Bildlaufposition von UITableView zurückgeben!

Xcode-12.0iOS-14.0Swift-5.3

Einführung

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
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)

Methode

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.

Ausführungsergebnis 1

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
1 2 3 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. .. ..

Ausführungsergebnis 2

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
l_1 l_2 l_3 l_4

Alle Muster sehen gut aus: tada:

Ausführungsergebnis 3

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.

cell

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
b_l_1 b_l_2 b_l_3 b_l_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?

Fazit

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

scroll

20201024 Nachtrag

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:

abschließend

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

Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte den Inhalt der Absicht var_dump
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich möchte mehrere Rückgabewerte für das eingegebene Argument zurückgeben
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich möchte die JSP des offenen Portlets bei der Entwicklung von Liferay kennen
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Schaltfläche [Schienen], um zum Anfang der Seite zurückzukehren
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte den Wert in Ruby erhalten
Ich möchte den Wert von Cell unabhängig vom CellType (Apache POI) transparent erhalten.
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich möchte eine Methode einer anderen Klasse aufrufen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich möchte die Hauptmethode mit Reflektion aufrufen
[Grober Kommentar] Ich möchte die Zupfmethode heiraten
Ich möchte die Protokollausgabe unter Android vereinfachen
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
[Active Admin] Ich möchte den Umfang der Sammlung angeben, die in select_box angezeigt werden soll
Ich möchte RadioButtons an derselben Stelle auf dem Bildschirm in derselben RadioGroup platzieren
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
9 Entspricht dem Rückgabewert
[Rails] [Bootstrap] Ich möchte die Schriftgröße entsprechend ändern
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
(´-`) .. oO (Ich möchte die Standardausgabe" Hallo "leicht finden.
Ich möchte Tomcat auf den Server bringen und die Anwendung starten
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen