LoginSignup
9
9

More than 5 years have passed since last update.

TableViewの先頭に行を追加した時、スクロール位置を保持したい(iOS 11)

Last updated at Posted at 2017-11-09

やりたいこと

  • TableViewで先頭に行を追加し、relodDataする
  • contentOffset.yは、行を追加する前と同じ値であるため、見た目上、上の方へ勝手にスクロールしたように見えてしまう
    • つまり追加した行の先頭のほうが表示される

これを解決するために、前は以下の方法でうまく言っていた。

let oldContentOffset = tableView.contentOffset
tableView.reloadData()
// 追加した行の高さ分、加算してスクロールを下へずらして補正
tableView.contentOffset = CGPoint(x: 0, y: oldContentOffset.y + rowHeight * insertedRows)

しかし、どうもiOS 11 + Xcode 9からうまくいかない??(私の他のバグの可能性あり)。contentOffset.yが勝手に設定前の値?に戻ってしまう。estimatedRowHeightがセルの高さを返すようにしてもダメだった。

そこで、こうしたらうまくいった。

let oldContentOffset = self.contentOffset
tableView.reloadData()
// ノーアニメで新しく読み込んだ次の内容が先頭に来るように移動
tableView.scrollToRow(at: IndexPath(row: readPosts.count, section: 0), 
                      at: UITableViewScrollPosition.top,
                      animated: false)
// 前回の先頭からのオフセット分ずらす
self.contentOffset = CGPoint(x: 0, y: self.contentOffset.y + oldContentOffset.y)
9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9