使用带有 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 上调用 endUpdatesUITableViewRowAnimation 的 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 的动画的主要内容,如果未能解决你的问题,请参考以下文章

reload方法

iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表

添加带有向上动画的部分/行

如何在使用 reloadData 时执行单元格选择动画?

在没有动画的情况下执行 UICollectionView reloadData

ios11 中uicollectionview reloaddata 为啥页面会滑动一下