tl;博士
当在 UITableView 中删除一个部分,而滚动偏移量位于表格中间的某个位置时,动画流程如下所示 -
- contentOffset 立即设置为 (0,0) (没有动画,只是弹出)
- 该部分很好地消失了
我想让这个动画流程更好一点 - 淡出该部分,然后(或同时以平滑的方式)滚动表格的“死区”。
多解释一点
我使用 NSFetchedResultsController 作为 UITableView 的数据源来显示行并在 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;
...
}
}
我得到了 and 的所有样板,controllerWillChangeContent
这段controllerDidChangeContent
代码的结果是,如果特定部分中的所有行都被删除 - 该部分也被删除。
问题(正如我在 tl;dr 部分中指定的那样)是动画无法按预期工作 - 如果部分删除发生在滚动到已删除部分的一半时,滚动内容会立即更改并且该部分消失,看起来很破。
有没有人偶然发现过这样的情况?我确信我可以在不使用 NSFetchedResultsController 的情况下将其缩小到一般问题,这就是我目前正在使用的代码。
如果需要,我很乐意添加更多信息。
谢谢!
更新 1
因此,在手动玩了一下 contentOffset 之后,我可以在执行此流程时得到部分工作 -
- 当
NSFetchedResultsController
调用controllerWillChangeContent
我保存 UITableView contentOffset (之前beginUpdates
) - 当
controllerDidChangeContent
被调用并且在我调用之后endUpdates
我保存了表的 contentOffset (这是没有动画的偏移量) - 我滚动回第 1 部分中保存的原始 contentOffset 并使用
[tableView setContentOffset:offsetAfterEndUpdates animated:YES]
滚动到新的偏移量
这不可能是最好的解决方案/Apple ment。