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;
现在这是我的问题:插入新行时,它们总是动画为“向下”滑动。在无限向上滚动时,它看起来很糟糕。
无论我是否将UITableViewRowAnimationNone
、UITableViewRowAnimationTop
或UITableViewRowAnimationBottom
作为参数传递,都会发生这种情况——该选项似乎被完全忽略了。
任何想法如何正确地为表格设置动画?
【问题讨论】:
【参考方案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 被忽略的主要内容,如果未能解决你的问题,请参考以下文章