UITableView 手动重新排序后的动画完成通知

Posted

技术标签:

【中文标题】UITableView 手动重新排序后的动画完成通知【英文标题】:Animation complete notification after UITableView is manually reordered 【发布时间】:2012-03-16 03:05:27 【问题描述】:

UITableView 具有内置动画,其中一个单元格被重新排序后,它会轻轻地放置在空白空间中。动画结束后是否有地方可以点击某种通知?我想在完成后调用一个方法。目前我正在使用performSelector:withObject:afterDelay:,目前工作正常,但我想知道是否可以使用完整的动画。 重申一下,我不是在谈论自定义动画,而是在 UITableView 中内置的动画。

我一直在四处寻找,似乎无法找到答案。

【问题讨论】:

可能重复:***.com/questions/7198633/… 【参考方案1】:

我意识到这个问题很古老,但是当我试图找到@Gobot 遇到的相同问题的答案时,我仍然偶然发现了它。好吧,事实证明有一个简单的解决方案。就像@Mitchell Vanderhoeff 所说的那样,您需要插入方法

- (void)tableView:(UITableView *)tableView
        moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
        toIndexPath:(NSIndexPath *)toIndexPath 
        [CATransaction setCompletionBlock:^
            // Completion code here
        ];

在您的 tableview 委托中,从 tableview 中获取它即将移动一行的通知。关键是 CATransaction setCompletionBlock。这将允许您在 tableview 为行移动所做的隐式动画事务上设置完成块。顾名思义,你在该块中放置的任何内容都将在动画完成后执行。

如果 QuartzCore 框架尚未包含在您的项目中,您将需要包含它。

【讨论】:

【参考方案2】:

如果您可以访问表视图数据源,这将变得非常容易。您只需在表格视图单元格上设置一个属性并在数据源中实现一个方法。您必须设置的属性是

tableViewCell.showsReorderControl = YES;

你可能已经设置了。现在你要做的就是在数据源中实现这个方法:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

每当用户释放正在重新排序的单元格时,表格视图必须告诉数据源重新排序实际数据。你所要做的就是背负这个,就像这样:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
    [self doMyFavoriteThing];

就是这样!当然,这并不是严格意义上的动画结束,而是归结为同一个事件。

【讨论】:

以上是关于UITableView 手动重新排序后的动画完成通知的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 没有正确地为在屏幕外重新排序的单元格设置动画

进入编辑/重新排序模式时的 UITableViewCell 自定义绘图和动画

使用 angularjs 列出重新排序动画

如何在 UITableView 重新加载期间控制过渡动画? [复制]

调整帧大小后的 UITableView 滚动速度

在没有重新排序控制的情况下重新排序 UITableView