tl;dr
スクロール オフセットがテーブルの途中にあるときに UITableView のセクションを削除すると、アニメーションの流れは次のようになります。
- contentOffset はすぐに (0,0) に設定されます (アニメーションなし、ポップアップのみ)。
- セクションはうまくフェードアウトします
このアニメーションの流れをもう少し良くしたいと思います - セクションをフェードアウトし、後で(または同時に滑らかな方法で)テーブルの「デッドゾーン」をスクロールして戻します。
もう少し説明
私は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 を少しいじった後、このフローを実行するときに部分的に機能するものを得ることができます -
NSFetchedResultsController
呼び出し時controllerWillChangeContent
に UITableView contentOffset (前beginUpdates
)を保存します。controllerDidChangeContent
が呼び出され、呼び出したendUpdates
直後に、テーブルの contentOffset を保存します (これはアニメーション化されていないオフセットです)- パート 1 で保存した元の contentOffset にスクロールして戻り
[tableView setContentOffset:offsetAfterEndUpdates animated:YES]
、新しいオフセットまでスクロールするために使用します。
これは最善の解決策ではありません/ Apple の見解.