上部に行を挿入する tableView があります。
これを実行している間、現在のビューは完全に静止したままにしておきたいので、行は上にスクロールしたときにのみ表示されます。
基礎となる UIScrollview の現在の位置を保存し、行が挿入された後に位置をリセットしようとしましたが、最終的には同じ場所に戻りますが、上下に揺れが発生します。
これを実現する良い方法はありますか?
更新: beginUpdate、insertRowsAtIndexPath、endUpdates を使用しています。reloadData 呼び出しはありません。
scrollToRowAtIndexPath は、現在のセルの先頭にジャンプします (行を追加する前に保存されます)。
私が試したもう一つのアプローチは、その通り適切なペースですが、振動があります。
save tableView currentOffset. (Underlying scrollView method)
Add rows (beginUpdates,insert...,endUpdates)
reloadData ( to force a recalulation of the scrollview size )
Recalculate the correct new offset from the bottom of the scrollview
setContentOffset (Underlying scrollview method)
問題は、reloadData によって scrollview/tableview が短時間スクロールを開始し、setContentOffset によって正しい場所に戻されることです。
表示を開始せずに、tableView に新しいサイズを認識させる方法はありますか?
全体を beginAnimation commitAnimation でラップしても、あまり役に立ちません。
更新 2: これは明らかに実行可能です。更新情報をプルダウンしたときに、公式 Twitter アプリを参照してください。
ベストアンサー1
すべての行の高さを合計する必要はまったくありません。テーブルを再読み込みした後の新しい contentSize がすでにそれを表しています。したがって、contentSize の高さの差分を計算し、それを現在のオフセットに追加するだけです。
...
CGSize beforeContentSize = self.tableView.contentSize;
[self.tableView reloadData];
CGSize afterContentSize = self.tableView.contentSize;
CGPoint afterContentOffset = self.tableView.contentOffset;
CGPoint newContentOffset = CGPointMake(afterContentOffset.x, afterContentOffset.y + afterContentSize.height - beforeContentSize.height);
self.tableView.contentOffset = newContentOffset;
...