当滚动偏移位于表格中间某处时,删除UITableView中的某个部分时,动画流程就像这样 -
我想让这个动画流程更好一点 - 逐渐消失该部分,然后(或同时以平滑的方式)滚动表格的“死区”。
我正在使用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;
...
}
}
我获得了controllerWillChangeContent
和controllerDidChangeContent
的所有样板,此代码的结果是,如果删除了特定部分中的所有行,则该部分也会被删除。
问题(正如我在tl; dr部分中指定的那样)是动画无法按预期工作 - 如果在删除部分中途滚动部分时发生了部分删除,则滚动内容会立即更改,部分会逐渐消失,这看起来很糟糕。
有没有人偶然发现这样的情况?我确信我可以在不使用NSFetchedResultsController的情况下将其缩小到一般性问题,这就是我正在使用的代码。
如果需要,我很乐意添加更多信息。
谢谢!
因此,在手动使用contentOffset后,我可以在执行此流程时获得部分工作 -
NSFetchedResultsController
调用controllerWillChangeContent
时,我保存了UITableView contentOffset(beginUpdates
之前)controllerDidChangeContent
时,我调用endUpdates
后立即保存表格的contentOffset(这是未设置动画的偏移量)[tableView setContentOffset:offsetAfterEndUpdates animated:YES]
滚动到新的偏移量这不能是最好的解决方案/ Apple的精神。
答案 0 :(得分:0)
UITableViewDelegate
也符合UIScrollViewDelegate
协议,因此您可以将该部分删除操作延迟到
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
// try to perform your action here,
// for instance you could re-attach your NSFetchedResultController delegate here
}
答案 1 :(得分:0)
一种有效的方法(至少根据我的经验)是a)删除该部分,b)不删除各行。
如需参考,请查看TLIndexPathUpdates
中的TLIndexPathTools初始值设定项。它计算批量更新,我认为它适用于您所描述的场景。
答案 2 :(得分:0)
好!
因此经过深入挖掘后,我发现问题出在我的代码中(就像我在发布后就被评论过一样)。很难找到但是在beginUpdates和endUpdates之间我更改了UITableView页脚视图,这与viewOffset动画混淆。
就是这样,我的错,不是Apple。
感谢Jonathan Cichon的帮助!