删除部分时UITableView的平滑动画

时间:2013-06-10 08:57:08

标签: ios objective-c ios6 uitableview

TL;博士

当滚动偏移位于表格中间某处时,删除UITableView中的某个部分时,动画流程就像这样 -

  1. contentOffset立即设置为(0,0)(没有动画,只是弹出)
  2. 该部分很好地消失了
  3. 我想让这个动画流程更好一点 - 逐渐消失该部分,然后(或同时以平滑的方式)滚动表格的“死区”。

    更多解释

    我正在使用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;
             ...    
        }        
    }
    

    我获得了controllerWillChangeContentcontrollerDidChangeContent的所有样板,此代码的结果是,如果删除了特定部分中的所有行,则该部分也会被删除。

    问题(正如我在tl; dr部分中指定的那样)是动画无法按预期工作 - 如果在删除部分中途滚动部分时发生了部分删除,则滚动内容会立即更改,部分会逐渐消失,这看起来很糟糕。

    有没有人偶然发现这样的情况?我确信我可以在不使用NSFetchedResultsController的情况下将其缩小到一般性问题,这就是我正在使用的代码。

    如果需要,我很乐意添加更多信息。

    谢谢!

    更新1

    因此,在手动使用contentOffset后,我可以在执行此流程时获得部分工作 -

    1. NSFetchedResultsController调用controllerWillChangeContent时,我保存了UITableView contentOffset(beginUpdates之前)
    2. 调用controllerDidChangeContent时,我调用endUpdates后立即保存表格的contentOffset(这是未设置动画的偏移量)
    3. 我滚动回到我在第1部分中保存的原始contentOffset并使用[tableView setContentOffset:offsetAfterEndUpdates animated:YES]滚动到新的偏移量
    4. 不能是最好的解决方案/ Apple的精神。

3 个答案:

答案 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的帮助!