我有简单的代码:
[otherClass doMethodOneWhichHasAnimation];
并且该动画持续0.8秒。接下来是推送viewcontroller的代码:
SchemeView *schemeView = [[SchemeView alloc] init];
[self.navigationController pushViewController:schemeView animated:YES];
[schemeView release];
问题是,它无需等待就推动了viewcontroller,我希望它等待。做延迟只会延迟整个事情,包括第一个动画开始。
如何让它在运行第二位代码之前等待0.8秒?
答案 0 :(得分:14)
动画完成后你可以推动
[UIView animateWithDuration:0.8
animations:^{
// Animation
}
completion:^(BOOL finished){
// PushView
}];
for< iOS 4+看看setAnimationDidStopSelector
或
[self performSelector:@selector(metohodToPushView) withObject:nil afterDelay:0.8];
答案 1 :(得分:14)
您可以使用CATransaction
在任何动画后运行完成块,而无需更改创建动画的方法的源代码。您需要link with the QuartzCore
framework,然后才需要#import <QuartzCore/QuartzCore.h>
。然后你可以这样做:
[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
// This block runs after any animations created before the call to
// [CATransaction commit] below. Specifically, if
// doMethodOneWhichHasAnimation starts any animations, this block
// will not run until those animations are finished.
SchemeView *schemeView = [[SchemeView alloc] init];
[self.navigationController pushViewController:schemeView animated:YES];
[schemeView release];
}];
// You don't need to modify `doMethodOneWhichHasAnimation`. Its animations are
// automatically part of the current transaction.
[otherClass doMethodOneWhichHasAnimation];
} [CATransaction commit];
答案 2 :(得分:0)
我通过创建一个新的类来运行动画来解决这个问题。
此类计算与动画开始同步传递的时间。
您可以将动画的时间输入到课程中,动画块和课程计数器都会将该数字输入。
当计数器到达终点时,您知道动画也已完成。
......所有没有随机复杂的图书馆。
答案 3 :(得分:-2)
只需调用延迟时间间隔的方法
像 -
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.00];