やりたいこと
- 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)