上部に行を挿入するときに uitableview を静的に保つ 質問する

上部に行を挿入するときに uitableview を静的に保つ 質問する

上部に行を挿入する 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;
    ...

おすすめ記事