Wie kann ich die UITableView-Bildlaufposition abrufen, um sie zu speichern?

73

Gibt es eine Möglichkeit herauszufinden, welche UITableViewCellsich oben im Bildlauffenster befindet?

Ich möchte die aktuelle Bildlaufposition erhalten, damit ich sie beim Beenden der App speichern kann. Wenn die App gestartet wird, möchte ich zu der Position scrollen, an der sie sich beim letzten Beenden befand.

Progrmr
quelle

Antworten:

160

Sie können den genauen Versatz der Tabellenansicht leicht ermitteln, indem Sie sich deren contentOffsetEigenschaft ansehen . Schauen Sie sich für die vertikale Schriftrolle Folgendes an:

tableView.contentOffset.y;
Ben Gottlieb
quelle
1
Das ist ein CGPoint in der Bildlaufansicht. Ich bin mir nicht sicher, wie ich feststellen kann, welcher UITableViewCell das entspricht.
Programm
15
Sie benötigen die Zelle nicht, wenn Sie den Offset verwenden. Stellen Sie einfach den Versatz ein, wenn Sie die Ansicht erneut aufrufen. Wenn Sie jedoch die Zelle oben kennen MÜSSEN, verwenden Sie einfach: [tableView indexPathForRowAtPoint: CGPointMake (0, 0)];
Ben Gottlieb
Die Verwendung von contentOffset funktioniert einwandfrei und gibt die Bildlaufposition genau dort zurück, wo sie sich beim letzten Beenden der App befand. Vielen Dank! Ich musste doch nicht wissen, um welche Zelle es sich handelte.
Programm
Verwenden Sie für den Benutzer c # diesen Fall: tableView.ContentOffset.Y;
Guillaume V
11

Die akzeptierte Lösung funktioniert nur, wenn Sie die Größe aller Elemente der Tabellenansicht kennen. Bei automatischer Größenanpassung / geschätzter Größe ist dies nicht immer der Fall.

Eine Alternative besteht darin, das erste sichtbare Element zu speichern und dorthin zu scrollen.

Sie können den ersten sichtbaren Elementindexpfad erhalten mit:

savedIndex = tableView.indexPathsForVisibleRows?.first

Scrollen Sie dann wie folgt:

tableView.scrollToRowAtIndexPath(savedIndex, atScrollPosition: .Top, animated: false)
Heinrisch
quelle
1

Stellen Sie sicher, dass Sie in viewWillAppear und nicht in viewDidLoad (getestetes iOS 9) laden können. ViewWillAppear ist, wenn die Ansicht das Layout beendet hat - es gibt Unterschiede im Ergebnis.

-(void) viewWillAppear:(BOOL)animated {
    NSUserDefaults *lightData = [NSUserDefaults standardUserDefaults];
    [self.tableView setContentOffset:CGPointMake(0, [lightData floatForKey:@"yValue"])];
}

-(void) viewWillDisappear:(BOOL)animated {
    NSUserDefaults *lightData = [NSUserDefaults standardUserDefaults];
    [lightData setFloat:self.tableView.contentOffset.y forKey:@"yValue"];
    [lightData synchronize];
}
coolcool1994
quelle