ios - 删除部分时 UITableView 的平滑动画

标签 ios objective-c ios6 uitableview

tl;dr

当滚动偏移位于表格中间某处时删除 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;
         ...    
    }        
}

我得到了 controllerWillChangeContentcontrollerDidChangeContent 的所有样板,这段代码的结果是,如果特定部分中的所有行都被删除 - 该部分也被删除.

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

有没有人遇到过这样的情况?我确定我可以在不使用 NSFetchedResultsController 的情况下将其缩小为一般问题,这正是我当前使用的代码。

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

谢谢!

更新1

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

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

不可能是最好的解决方案/苹果认为的。

最佳答案

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

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    // try to perform your action here, 
    // for instance you could re-attach your NSFetchedResultController delegate here
}

关于ios - 删除部分时 UITableView 的平滑动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020184/

相关文章:

c# - 如何删除 CollectionView IOS 中行之间的额外行间距?

objective-c - NSSet 到 NSArray 转换调用 objectAtIndex?

ios - 当我取消添加到弹出窗口中的联系人时 UItextView 崩溃

iphone - 以编程方式删除标准 UITableView 中的栏

uitableview - iOS UItableview scrollToRowAtIndexPath不再起作用

android - react 导航从嵌套导航器更改 Activity 选项卡

ios - 在安装 iOS 应用程序时提醒用户所需的 iOS 版本

objective-c - Cocoa Webkit - 禁用文本选择,但允许文本字段选择

objective-c - UICollectionView 在包含标题时不会重新加载项目

ios - 隐藏导航栏上的后退按钮是iOS6