UITableViewRowAnimation 被忽略

Posted

技术标签:

【中文标题】UITableViewRowAnimation 被忽略【英文标题】:UITableViewRowAnimation is ignored 【发布时间】:2013-04-09 00:29:20 【问题描述】:

我正在使用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; 

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

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

【问题讨论】:

【参考方案1】:

请尝试如下。

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

【讨论】:

非常感谢您。在我的表格视图中插入新部分时,我得到了一个丑陋的动画,这已经修复了它(救生圈)。 您忘记了 [CATransaction begin] 并提交...?【参考方案2】:

所以我想通了。

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

好像有道理。

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

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

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

【讨论】:

WWDC 2011 没有标题为“高级表格视图技术”的演讲。您的意思是“UITableView 更改、提示和技巧”吗?如果没有,你能链接到你的意思吗?谢谢。 @trss 对不起,我真的不确定了,有一段时间没做 ios 了。也许它就是你所指的那个。【参考方案3】:

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

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

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

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

它完美地工作。

【讨论】:

老实说,对于荒谬的过度复杂化来说,这是一个不错的技巧。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于UITableViewRowAnimation 被忽略的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewRowAnimation自动如何确定要使用哪个动画?

用动画重新加载表格视图单元格(Swift)

IOS关于tableView刷新指定行的一点坑

如何查看端口被是不是被占用

怎么知道网站是否被黑 服务器是否被***呢

怎么防止网站被***和防止服务器被黑