2013-08-10 9 views
7

スクロール中にUITableViewの新しいセクション(セクションに3つのセルを含む)を挿入します。UITableViewスクロール中に上部にセクションを挿入する

 [_mainTable beginUpdates]; 
     [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
     [_mainTable endUpdates]; 

セクションが正しく挿入されます。しかし、それはテーブルの上、つまりセル0または行0の上に表示されます。私はこのトランザクションをスムーズにします。私はendUpdates後

[_mainTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 

を挿入することができますが、それは突然、あなたの最後の位置にスクロールし、その後、表の一番上表示されますので、迅速なジャークを示しています。

どうすれば滑らかにすることができますか?

おかげ

答えて

9

私はこの上の徹底的なテストを行っていないが、これは有望なようだ:

  1. 可視セルの一つのNSIndexPathを識別します。
  2. rectForRowAtIndexPathを取得してください。
  3. テーブルの現在のcontentOffsetを取得します。
  4. セクションを追加しますが、insertSectionsの代わりにreloadDataを呼び出してください(妨げになることを防ぎます)。
  5. このように手順5と手順2

のそれからの結果の違いにより更新contentOffsetステップ2.

  • になっ更新rectForRowAtIndexPathを取得:

    [self.sections insertObject:newSection atIndex:0]; // this is my model backing my table 
    
    NSIndexPath *oldIndexPath = self.tableView.indexPathsForVisibleRows[0]; // 1 
    CGRect before = [self.tableView rectForRowAtIndexPath:oldIndexPath];  // 2 
    CGPoint contentOffset = [self.tableView contentOffset];     // 3 
    [self.tableView reloadData];            // 4 
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row inSection:oldIndexPath.section + 1]; 
    CGRect after = [self.tableView rectForRowAtIndexPath:newIndexPath];  // 5 
    contentOffset.y += (after.origin.y - before.origin.y); 
    self.tableView.contentOffset = contentOffset;        // 6 
    
  • +1

    ありがとうございました非常に仲間。私はこれと長い間闘っていた。 – Mann

    +0

    上記のコードは魅力的に機能しますが、私の個人的な理解のために私はポイント5を得ませんでした。なぜここに古い四角形が必要ですか? – Mann

    +1

    @mann目に見える行のどれがどれだけ下にシフトしたのか見てみようとしていました。ですから、私は挿入の前に目に見える行のためのrectを取得し、後に、そして 'contentOffset'を調整する' y'値の差を使用して、以前と同じ場所に行が現れるようにします。 – Rob

    関連する問題