UITableViewRowAnimation被忽略

我正在使用NSFetchedResultsController来填充我的表。 我的表中的数据按升序排列(最新的消息在底部)。 更多的数据通过“无限滚动”加载到顶部:例如当用户滚动到顶部时,更多的消息被加载。 我的NSFetchedResultsControllerDelegate像往常一样定义,正如苹果文档中推荐的那样:通过插入新行

 - (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath*)newIndexPath { switch(type) { case NSFetchedResultsChangeInsert: NSLog(@"insertion at row %d", newIndexPath.row); [self.table insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone]; break; 

现在,这是我的问题:插入新行时,它们总是以滑动“向下”的方式animation。 在无限滚动向上看起来不好。 无论我传递UITableViewRowAnimationNoneUITableViewRowAnimationTop还是UITableViewRowAnimationBottom作为参数,都会发生这种情况 – 该选项似乎完全被忽略。

任何想法如何正确animation表?

请尝试如下。

 [CATransaction setDisableActions:YES]; [self.table insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone]; [CATransaction setDisableActions:NO]; // reset to original value 

所以我想通了。

WWDC 2011对话“高级表格视图技术”明确表示,UITableViewRowAnimationNone并不意味着没有animation(:

仿佛它是有道理的。

animation参数仅仅定义行被插入到空间中的方式(例如,从右/左/等滑动), 创build该空间的转换是animation的,而不pipe用户想要什么。

所以是的, 没有办法插入/删除/刷新单个单元格, reloadData是要走的路。 我爱你,苹果。

现在根据stackoverflow上的许多答案也没有办法插入内容在表的顶部,而不会改变当前视图(例如,毫不掩饰地插入的东西,没有任何改变,用户看到的)。 最好的办法就是在新数据到达后改变contentOffset

我find了一种禁用插入/删除单元格animation的方法。

  [UIView setAnimationsEnabled:NO]; [_tableView beginUpdates]; [_table insertCell...]; [_table removeCell...] [_table endUpdates]; [UIView setAnimationsEnabled:YES]; 

这是完美的工作。

从iOS 7.0开始,可以将代码封装在一个performWithoutAnimation:块中,如下所示:

 [UIView performWithoutAnimation:^{ [self.tableView beginUpdates]; [self.tableView deleteRowsAtIndexPaths:rowsToRemove withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; }]; 

你把数据分成几个部分? 如果是,请检查controller:didChangeSection:atIndex:forChangeType:的实现controller:didChangeSection:atIndex:forChangeType:因为新节插入将使用该方法中使用的animationtypes进行animation,而不是controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: