使用带有 reloadData 的动画
Posted
技术标签:
【中文标题】使用带有 reloadData 的动画【英文标题】:Using an animation with reloadData 【发布时间】:2013-08-05 14:48:28 【问题描述】:在我的 UITableView 实例中,我将单元格移动到 index:0 并重新加载数据。问题是单元格“捕捉”到顶部(我认为是由于 reloadData)。我想知道我是否可以将单元格向上移动,然后在几秒钟后应用 reloadData。这是我的代码:
[_toDoItems removeObject:todoItem];
[_toDoItems insertObject:todoItem atIndex:0 ];
[self.tableView beginUpdates];
[self.tableView moveRowAtIndexPath:origIndexPath toIndexPath:0];
[self.tableView endUpdates];
sleep(1);
[self.tableView reloadData];
这样做的问题是,调用该方法后,一切都会暂停 1 秒,然后出现“snap”动画。
【问题讨论】:
sleep(1);
有什么用?删除它。
sleep()
永远不应该被使用。它阻塞了所有线程,包括处理所有视觉效果的主线程。这就是为什么您会看到它等待一秒钟,然后突然响起。咬合只是在等待它的踏板被解锁。此外,由于reloadData
没有任何动画,它会产生“捕捉”效果。
我的逻辑是,单元格会移到顶部;那么它的睡眠会延迟 reloadData 1 秒。
【参考方案1】:
你首先告诉 tableView 期待更新 beginUpdates
。然后更新相关部分(如果您的 tableView 只有一个部分,则只需为部分编号传递零)。在这里您可以指定动画 - 您可以使用它来获得您想要的效果。之后,您在 tableView 上调用 endUpdates
。 UITableViewRowAnimation
的 typedef 指定:
typedef enum
UITableViewRowAnimationFade,
UITableViewRowAnimationRight,
UITableViewRowAnimationLeft,
UITableViewRowAnimationTop,
UITableViewRowAnimationBottom,
UITableViewRowAnimationNone,
UITableViewRowAnimationMiddle,
UITableViewRowAnimationAutomatic = 100
UITableViewRowAnimation;
四处看看你想要哪一个。即使选择UITableViewRowAnimationNone
有时也会有很好的效果。根据您可以使用的部分数量- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
表格更新代码如下:
[self.tableView beginUpdates];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
【讨论】:
@brain 如果您发现任何有用的答案,请点赞,如果答案正确,请接受,这将有助于删除未回答的问题列表中的问题。【参考方案2】:解决了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(briefPause) userInfo:nil repeats:NO];
我用上面的方法和上面一样
[self.tableView beginUpdates]
....
但我创建了一个新功能,briefPause,它只是:
[self.tableView reloadData];
【讨论】:
它确实有效,但我建议使用更少的时间:[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(briefPause) userInfo:nil repeats:NO];它仍然可以工作,但看起来更流畅【参考方案3】:试试这个:
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:origIndexPath
inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0
inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
【讨论】:
正如其他人在上面提到的,不要使用 sleep()。我禁止! :) 甚至用 RowAnimation: 调整到别的东西,它并不能真正解决问题。它可以防止奇怪的快照/闪烁,但单元格只是瞬间出现在顶部而没有动画。 ://以上是关于使用带有 reloadData 的动画的主要内容,如果未能解决你的问题,请参考以下文章
iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表