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

Gob*_*bot 5 uitableview ios

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

我一直在寻找,似乎无法收集答案.

Wil*_*ore 5

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

- (void)tableView:(UITableView *)tableView
        moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
        toIndexPath:(NSIndexPath *)toIndexPath {
        [CATransaction setCompletionBlock:^{
            // Completion code here
        }];
}
Run Code Online (Sandbox Code Playgroud)

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

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


小智 0

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

tableViewCell.showsReorderControl = YES;
Run Code Online (Sandbox Code Playgroud)

您可能已经设置了。现在您所要做的就是在数据源中实现此方法:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
Run Code Online (Sandbox Code Playgroud)

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

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
    [self doMyFavoriteThing];
}
Run Code Online (Sandbox Code Playgroud)

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