2011-08-26 66 views
16

如何知道[UITableView setEditing:YES animated:YES]何时完成?如何判断UITableView动画何时结束?

我不想给出任何上下文,因为我想避免任何人给我解决方法,这些我不感兴趣。

我想要的是调用上述,然后在动画完成时调用一个单独的函数。


我被编辑后给出的上下文和一些解决方法。 最初我setEditing并立即重新加载表数据。

[tableView setEditing:YES animated:YES]; 
[tableView reloadData]; 

问题是表在动画开始之前重新加载,所以动画从未出现。

这里有一些不同的解决方法:

[tableView setEditing:YES animated:YES]; 
[self performSelector:@selector(ReloadTable) withObject:nil afterDelay:1.0]; 

这工作,但如果我得到的延迟不正确,它会看起来很糟糕。所以我需要知道延迟是什么,我可以弄清楚,但我们不敢保证延迟总是一样的。

isEditing = YES; 
[tableView reloadData]; 
[tableView setEditing:YES animated:YES]; 

这可以工作,但表格的行为有所不同,取决于我们是否处于编辑模式。所以我必须使用我自己的isEditing变量而不是标准的UITableView.editing。我宁愿不必创建一个新的布尔isEditing变量。

[tableView setEditing:YES animated:YES]; 
[tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationTop]; 

这几乎是效果很好,但在编辑模式下的第一行应该有UITableViewCellEditingStyleInsert,而其他行获得UITableViewCellEditingStyleDelete。通过上面的代码,在添加行之前,编辑样式会被设置。因此第二行以UITableViewCellEditingStyleInsert结束。

回答

46
[CATransaction begin]; 
[CATransaction setCompletionBlock: ^{ 
    // your animation has finished 
}]; 
[tableView setEditing:YES animated:YES]; 
[CATransaction commit]; 

注意setCompletionBlock必须在顶部。

+2

+1这工作*完美*。 – Isaac

+2

我已经尝试了很多关于这个问题的其他线程的建议,这是第一个工作的! – Marty

+0

真是个好主意! – Swindler

3

在iOS 4的,你可以做到以下几点:

[UIView animateWithDuration:0.3f 
       animations:^{ 
        [self.tableView setEditing:YES animated:NO]; 
       } 
       completion:^(BOOL finished){ 
        // Do something 
       } 
]; 
+0

这种运作良好(+1),但在另一个答案'CATransaction'建议更好地工作。 – Isaac

+0

这取决于Apple为动画选择的时间。如果他们在未来的版本中更改时间,那么这将不再适用。查看接受的答案以获得更好的方式。 – fishinear

1

斯威夫特4版本接受的答案:

CATransaction.begin() 
CATransaction.setCompletionBlock { 
    // your animation has finished 
} 
tableView.setEditing(true, animated: true) 
CATransaction.commit()