UITableViewRowAnimation被忽略

时间:2013-04-09 00:29:21

标签: ios animation nsfetchedresultscontroller

我正在使用NSFetchedResultsController来填充我的表格。我表中的数据按升序排列的时间戳排序(底部的最新消息)。更多数据通过“无限滚动”加载到顶部:例如当用户滚动到顶部时,会加载更多消息。我的NSFetchedResultsControllerDelegate按照惯例定义,如Apple文档中所建议的那样:通过

插入新行
- (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; 

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

有关如何正确制作表格动画的任何想法吗?

5 个答案:

答案 0 :(得分:13)

请尝试以下方式。

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

答案 1 :(得分:10)

所以我已经明白了。

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

好像有道理。

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

所以是的,没有方式来插入/删除/刷新单个单元格,reloadData是可行的方法。我爱你,Apple。

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

答案 2 :(得分:6)

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

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

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

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

完美的工作。

答案 3 :(得分:4)

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

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

答案 4 :(得分:0)

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