我正在使用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;
现在我的问题是:当插入新行时,它们总是动画为“向下”滑动。在无限向上滚动它看起来很糟糕。
无论我是以UITableViewRowAnimationNone
,UITableViewRowAnimationTop
还是UITableViewRowAnimationBottom
作为参数,都会发生这种情况 - 该选项似乎完全被忽略。
有关如何正确制作表格动画的任何想法吗?
答案 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:
。