Ich habe ein UITableView
, die mit Zellen variabler Höhe gefüllt ist. Ich möchte, dass die Tabelle nach unten rollt, wenn die Ansicht in die Ansicht verschoben wird.
Ich habe derzeit die folgende Funktion
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log ist ein veränderbares Array, das die Objekte enthält, aus denen der Inhalt jeder Zelle besteht.
Der obige Code funktioniert einwandfrei, viewDidAppear
hat jedoch den unglücklichen Nebeneffekt, dass der obere Rand der Tabelle angezeigt wird, wenn die Ansicht zum ersten Mal angezeigt wird, und dann nach unten gesprungen wird. Ich würde es vorziehen, wenn dietable view
nach unten gescrollt werden könnte, bevor es erscheint.
Ich habe das Scrollen versucht viewWillAppear
und viewDidLoad
in beiden Fällen wurden die Daten noch nicht in die Tabelle geladen und beide lösen eine Ausnahme aus.
Jede Anleitung wäre sehr dankbar, auch wenn es nur darum geht, mir zu sagen, was ich habe, ist alles, was möglich ist.
quelle
[table reloadData];
CGPoint(x: 0, y: tableView.contentSize.height)
?Ich denke, der einfachste Weg ist folgender:
Swift 3 Version:
quelle
messages.count
durch das bereits implementierte zu ersetzenmyTableView.dataSource!.tableView(myTableView, numberOfRowsInSection: 0)
. Ja, es ist länger, aber es kann eine Codewiederholung vermeiden. Sie müssen auch die Option behandelndataSource
(nicht wie in diesem Beispiel das Auspacken erzwingen).Nach Jacobs Antwort ist dies der Code:
quelle
UIEdgeInsetsInsetRect(self.messagesTableView.frame, self.messagesTableView.safeAreaInsets).height
Wenn Sie zum GENAUEN Ende des Inhalts scrollen müssen, können Sie dies folgendermaßen tun:
quelle
yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
? Vielen Dank.self.tableView.contentSize.height
Inhalt der Tabellenansicht scrollen möchten, ist dieser möglicherweise nicht sichtbar, da Sie unter den Inhalt scrollen. Daher müssen Sie zu einer "sichtbaren Lücke in der Tabellenansicht" über dem Ende der Tabellenansicht scrollen.Ich verwende Autolayout und keine der Antworten hat bei mir funktioniert. Hier ist meine Lösung, die endlich funktioniert hat:
quelle
setContentOffset
an einem anderen Punkt , wenn die Daten abgerufen und die Tabellenansicht neu geladen wurden?CGFLOAT_MAX
I habe ichcontentSize.height - frame.height + contentInset.bottom
beim Einstellen des anfänglichen Inhaltsversatzes verwendet. VerwendenCGFLOAT_MAX
schien für mich durcheinander zu bringen.Die von @JacobRelkin akzeptierte Lösung funktionierte in iOS 7.0 mit Auto Layout nicht für mich.
Ich habe eine benutzerdefinierte Unterklasse von
UIViewController
und fügte eine Instanzvariable_tableView
als Unteransicht ihrer hinzuview
. Ich habe_tableView
mit Auto Layout positioniert . Ich habe versucht, diese Methode am EndeviewDidLoad
und sogar in aufzurufenviewWillAppear:
. Beides hat nicht funktioniert.Also habe ich meiner benutzerdefinierten Unterklasse von die folgende Methode hinzugefügt
UIViewController
.Berufung
[self tableViewScrollToBottomAnimated:NO]
am Ende derviewDidLoad
Arbeiten. Leider wird es auchtableView:heightForRowAtIndexPath:
dreimal für jede Zelle aufgerufen.quelle
Hier ist eine Erweiterung, die ich in Swift 2.0 implementiert habe. Diese Funktionen sollten nach dem
tableview
Laden von aufgerufen werden :quelle
Einzelheiten
Code
Verwendung
Vollständige Probe
quelle
Tatsächlich ist ein "schneller" Weg, dies schnell zu tun ,:
Arbeit Perfekt für mich.
quelle
Ich wollte, dass die Tabelle mit dem Ende der im Rahmen gezeigten Tabelle geladen wird. Ich fand mit
funktionierte nicht, da es einen Fehler gab, wenn die Tischhöhe kleiner als die Rahmenhöhe war. Beachten Sie, dass meine Tabelle nur einen Abschnitt enthält.
Die Lösung, die für mich funktioniert hat, war die Implementierung des folgenden Codes in viewWillAppear:
Das BOOL ivar initialLoad wird in viewDidLoad auf TRUE gesetzt.
quelle
scrollToRowAtIndexPath
? Sie rufen bereitssetContentOffset
danach an, was diesen ersten Anruf möglicherweise sinnlos macht.Für Swift:
quelle
Sie sollten
UITableViewScrollPositionBottom
stattdessen verwenden.quelle
Für Swift 3 (Xcode 8.1):
quelle
Ist natürlich ein Bug. Wahrscheinlich irgendwo in Ihrem Code, den Sie verwenden
table.estimatedRowHeight = value
(zum Beispiel 100). Ersetzen Sie diesen Wert durch den höchsten Wert, von dem Sie glauben, dass eine Zeilenhöhe erreicht werden könnte , z. B. 500. Dies sollte das Problem in Kombination mit dem folgenden Code lösen:quelle
Nach vielem Fummeln hat das für mich funktioniert:
Der Schlüssel erwies sich als nicht Einwickeln
scrollToRowAtIndexPath
innerhalb vondispatch_async
wie einige vorgeschlagen haben, sondern einfach mit einem Anruf folgende eslayoutIfNeeded
.Mein Verständnis davon ist, dass das Aufrufen der Bildlaufmethode im aktuellen Thread garantiert, dass der Bildlaufversatz unmittelbar vorher festgelegt wird die Ansicht angezeigt wird. Als ich zum Haupt-Thread schickte, wurde die Ansicht für einen Moment angezeigt, bevor der Bildlauf wirksam wurde.
(Auch NB Sie brauchen die
viewHasAppeared
Flagge, weil Sie nicht wollengoToBottom
jedes MalviewDidLayoutSubviews
. Sie wird zum Beispiel aufgerufen, wenn sich die Ausrichtung ändert.)quelle
Mit den oben genannten Lösungen wird zum Ende Ihrer Tabelle gescrollt (nur wenn der Tabelleninhalt zuerst geladen wird):
quelle
In Swift 3.0
quelle
Wenn Sie die Daten vor dem Scrollen asynchron laden müssen, ist hier die mögliche Lösung:
quelle
Funktion bei Swift 3 nach unten scrollen
quelle
Sie sollten hinzufügen
oder es wird nicht nach unten scrollen.
quelle
Verwenden Sie diesen einfachen Code, um die Tabellenansicht nach unten zu scrollen
quelle
Danke Jacob für die Antwort. wirklich hilfreich, wenn jemand mit monotouch c # version interessant ist
quelle
In iOS hat das bei mir gut funktioniert
Es muss von aufgerufen werden
viewDidLayoutSubviews
quelle
[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) animiert: YES];
quelle
Die akzeptierte Antwort funktionierte nicht mit meiner Tabelle (Tausende von Zeilen, dynamisches Laden), aber der folgende Code funktioniert:
quelle
Sie müssen nicht scrollen. Sie können dies einfach mit diesem Code tun:
quelle
Wenn Sie den Rahmen für die Tabellenansicht programmgesteuert einrichten, stellen Sie sicher, dass Sie den Rahmen korrekt einstellen.
quelle
In Swift brauchen Sie nur
um es automatisch zum Buttom zu scrollen
quelle
In Swift 3.0 Wenn Sie zu einer bestimmten Zelle der Tabellenansicht wechseln möchten, ändern Sie den Zellenindexwert wie den Wert "self.yourArr.count".
quelle
Ich glaube, alte Lösungen funktionieren nicht mit swift3.
Wenn Sie Zahlenzeilen in der Tabelle kennen, können Sie Folgendes verwenden:
quelle