web-dev-qa-db-ja.com

UITableViewスクロール位置を取得して保存するにはどうすればよいですか?

スクロールウィンドウの一番上にあるUITableViewCellを見つける方法はありますか?

アプリが終了したときに保存できるように、現在のスクロール位置を取得したいです。アプリが起動したら、最後に終了したときの位置にスクロールしたいです。

70
progrmr

contentOffsetプロパティを調べることで、Table Viewの正確なオフセットを簡単に取得できます。垂直スクロールについては、次をご覧ください。

tableView.contentOffset.y;
157
Ben Gottlieb

受け入れられるソリューションは、すべてのテーブルビューアイテムのサイズがわかっている場合にのみ機能します。自動サイズ設定/推定サイズを使用すると、常に正しいとは限りません。

1つの代替方法は、最初に表示されるアイテムを保存してスクロールすることです。

以下を使用して、最初の表示項目indexPathを取得できます。

savedIndex = tableView.indexPathsForVisibleRows?.first

次に、以下を実行してスクロールします。

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

ViewDidLoadではなくviewWillAppearでロードできることを確認します(iOS 9でテスト済み)。 ViewWillAppearは、ビューがレイアウトを終了したときです-結果に違いがあります。

-(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];
}
1
coolcool1994