4

NSFetchedResultsController用来填充我的表。我表中的数据按照时间戳升序排列(最新消息在底部)。更多数据通过“无限滚动”加载到顶部:例如,当用户滚动到顶部时,会加载更多消息。按照苹果文档中的建议, MyNSFetchedResultsControllerDelegate像往常一样定义:新行通过

- (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; 

现在这是我的问题:当插入新行时,它们总是动画为“向下”滑动。在无限向上滚动时,它看起来很糟糕。无论我是通过还是作为参数UITableViewRowAnimationNone,都会发生这种情况- 该选项似乎被完全忽略了。UITableViewRowAnimationTopUITableViewRowAnimationBottom

任何想法如何正确地为表格设置动画?

4

5 回答 5

13

请尝试如下。

[CATransaction setDisableActions:YES];
[self.table insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
[CATransaction setDisableActions:NO]; // reset to original value
于 2014-07-01T08:44:35.420 回答
10

所以我想通了。

WWDC 2011 演讲“高级表格视图技术”明确表示 UITableViewRowAnimationNone 并不意味着没有动画(:

好像说得通似的。

动画参数仅定义行如何插入空间(例如从右/左/等滑动),无论用户想要什么,创建该空间的过渡都是动画的。

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

现在根据stackoverflow上的许多答案,也没有办法在不更改当前视图的情况下在表格顶部插入内容(例如,无缝插入内容而用户看到的内容根本没有变化)。最好的办法是contentOffset在新数据到达后更改。

于 2013-04-17T07:01:56.193 回答
6

我找到了一种禁用插入/删除单元格动画的方法。

    [UIView setAnimationsEnabled:NO];
    [_tableView beginUpdates];

    [_table insertCell...];
    [_table removeCell...]

    [_table endUpdates];
    [UIView setAnimationsEnabled:YES];

它完美地完成了工作。

于 2015-08-18T09:59:54.933 回答
5

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

[UIView performWithoutAnimation:^{
                    [self.tableView beginUpdates];
                    [self.tableView deleteRowsAtIndexPaths:rowsToRemove withRowAnimation:UITableViewRowAnimationNone];
                    [self.tableView endUpdates];
                }];
于 2016-05-20T17:42:34.900 回答
0

您是否将数据分成多个部分?如果是,请检查您的实现,controller:didChangeSection:atIndex:forChangeType:因为新部分插入将使用该方法中使用的动画类型进行动画处理,而不是controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:.

于 2013-04-10T14:52:33.097 回答