如何在deleteRowsAtIndexPaths中捕获动画结尾

时间:2012-08-09 08:42:18

标签: ios uitableview animation

我想知道是否有可能捕获在deleteRowsAtIndexPaths期间触发的动画是否结束?我想要做的是从UITableView删除一些所有行,除了我点击的一行。接下来我想在同一个UITableView中插入几行。这两个操作都在单独的beginUpadate / endUpdate块中执行。问题是在删除动画结束之前,插入动画开始,我希望它一个接一个地被触发,因为插入的行来自外部webservice。

我正在考虑在方法中包装插入和删除方法(在UITableView子类中),我可以用自定义的方法替换标准动画,并在第一个结束时使用objective-c块一个接一个地触发,但它似乎是不可能的或我不能这样做。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:14)

我认为将表格更新包装在animateWithDuration中会有效:

[UIView animateWithDuration:0.0 animations:^{
    [coursesTable beginUpdates];
    …
    [coursesTable endUpdates];
} completion:^(BOOL finished) {
    // Code to run when table updates are complete.
}];

我在Stack Overflow上找到的其他方法对我不起作用。

我一次使用这种技术并进行了足够的测试,以便在我调用表的endUpdates方法之后验证完成块被调用,并且调用它的时间似乎合理,但我重写了我的代码所以我不需要在我完全确认动画实际完成之前,它已经不复存在了。

答案 1 :(得分:0)

使用CATransaction来捕捉任何动画的完成

CATransaction.begin()
CATransaction.setCompletionBlock({
     // completion
})
// do your animation here
CATransaction.commit()

答案 2 :(得分:0)

从iOS 11到更高版本:

[tblProducts performBatchUpdates:^{
        [self->tblProducts deleteRowsAtIndexPaths:@[self.animDeleteIndex] withRowAnimation:UITableViewRowAnimationFade];
    } completion:^(BOOL finished) {
        [self->tblProducts reloadData];
}];