4

tl;博士

当在 UITableView 中删除一个部分,而滚动偏移量位于表格中间的某个位置时,动画流程如下所示 -

  1. contentOffset 立即设置为 (0,0) (没有动画,只是弹出)
  2. 该部分很好地消失了

我想让这个动画流程更好一点 - 淡出该部分,然后(或同时以平滑的方式)滚动表格的“死区”。

多解释一点

我使用 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 之后,我可以在执行此流程时得到部分工作 -

  1. NSFetchedResultsController调用controllerWillChangeContent我保存 UITableView contentOffset (之前beginUpdates
  2. controllerDidChangeContent被调用并且在我调用之后endUpdates我保存了表的 contentOffset (这是没有动画的偏移量)
  3. 我滚动回第 1 部分中保存的原始 contentOffset 并使用[tableView setContentOffset:offsetAfterEndUpdates animated:YES]滚动到新的偏移量

不可能是最好的解决方案/Apple ment。

4

3 回答 3

0

好的!

因此,经过深入挖掘后,我发现问题出在我的代码中(就像我在发布后立即评论一样)。很难找到,但在 beginUpdates 和 endUpdates 之间的某个地方我更改了 UITableView 页脚视图,这与 contentOffset 动画相混淆。

就是这样,我的错,不是苹果。

感谢乔纳森 Cichon 的帮助!

于 2013-06-11T06:03:47.643 回答
0

一种可行的方法(至少在我的经验中)是a)删除该部分,b)不要删除单个行。

作为参考,请查看TLIndexPathToolsTLIndexPathUpdates中的初始化程序。它计算批量更新,我认为它适用于您描述的场景。

于 2013-06-10T14:55:11.723 回答
0

AUITableViewDelegate也符合UIScrollViewDelegate协议,因此您可以将该部分删除操作延迟到

- (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 回答