4

tl;dr

スクロール オフセットがテーブルの途中にあるときに UITableView のセクションを削除すると、アニメーションの流れは次のようになります。

  1. contentOffset はすぐに (0,0) に設定されます (アニメーションなし、ポップアップのみ)。
  2. セクションはうまくフェードアウトします

このアニメーションの流れをもう少し良くしたいと思います - セクションをフェードアウトし、後で(または同時に滑らかな方法で)テーブルの「デッドゾーン」をスクロールして戻します。

もう少し説明

私はUITableViewのデータソースとしてNSFetchedResultsControllerを使用して、行を表示し、NSManagedObjectContextで変更が発生したときにテーブルを更新しています-このように(無関係なコードを削除しました)-

- (void)controller: (NSFetchedResultsController *)controller
   didChangeObject: (id)anObject
       atIndexPath: (NSIndexPath *)indexPath
     forChangeType: (NSFetchedResultsChangeType)type
      newIndexPath: (NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableController.tableView;
    switch(type) {
         ....
         NSFetchedResultsChangeDelete:[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
         break;
         ...    
    }        
}

controllerWillChangeContentとのボイラープレートをすべて取得しましたcontrollerDidChangeContent。このコードの結果は、特定のセクションのすべての行が削除されると、そのセクションも削除されるということです。

問題 (tl;dr セクションで指定したように) は、アニメーションが期待どおりに機能しないことです。削除されたセクションの途中までスクロールしているときにセクションの削除が発生した場合、スクロールの内容がすぐに変更され、セクションがフェードアウトします。かなり壊れているように見えます。

このような状況に遭遇したことのある人はいますか? NSFetchedResultsController を使用せずに一般的な問題に絞り込むことができると確信しています。これは、現在使用しているコードです。

必要に応じて、さらに情報を追加したいと思います。

ありがとう!

更新 1

したがって、手動で contentOffset を少しいじった後、このフローを実行するときに部分的に機能するものを得ることができます -

  1. NSFetchedResultsController呼び出し時controllerWillChangeContentに UITableView contentOffset (前beginUpdates)を保存します。
  2. controllerDidChangeContentが呼び出され、呼び出したendUpdates直後に、テーブルの contentOffset を保存します (これはアニメーション化されていないオフセットです)
  3. パート 1 で保存した元の contentOffset にスクロールして戻り[tableView setContentOffset:offsetAfterEndUpdates animated:YES]、新しいオフセットまでスクロールするために使用します。

これは最善の解決策ではありません/ Apple の見解.

4

3 に答える 3

0

わかった!

そのため、徹底的に掘り下げた後、問題は自分のコードにあることがわかりました(投稿直後にコメントされたように)。見つけるのはかなり困難でしたが、beginUpdates と endUpdates の間のどこかで、contentOffset アニメーションを台無しにする UITableView フッター ビューを変更しました。

それは私のせいで、Apple のせいではありません。

助けてくれてありがとうジョナサン・シチョン!

于 2013-06-11T06:03:47.643 に答える
0

AUITableViewDelegateUIScrollViewDelegateプロトコルに準拠しているため、そのセクションの削除アクションを遅らせることができます。

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    // try to perform your action here, 
    // for instance you could re-attach your NSFetchedResultController delegate here
}
于 2013-06-10T09:20:24.177 に答える
0

(少なくとも私の経験では) 機能する 1 つのアプローチは、a) セクションを削除し、b) 個々の行を削除しないことです。

参考までに、TLIndexPathToolsTLIndexPathUpdatesの初期化子を見てください。バッチ更新を計算し、説明したシナリオでうまく機能すると思います。

于 2013-06-10T14:55:11.723 に答える