在继续之前,我如何等待不同类中的动画完成?

时间:2011-06-13 11:53:49

标签: iphone objective-c uiviewanimation

我有简单的代码:

[otherClass doMethodOneWhichHasAnimation];

并且该动画持续0.8秒。接下来是推送viewcontroller的代码:

SchemeView *schemeView = [[SchemeView alloc] init];
    [self.navigationController pushViewController:schemeView animated:YES];
    [schemeView release];

问题是,它无需等待就推动了viewcontroller,我希望它等待。做延迟只会延迟整个事情,包括第一个动画开始。

如何让它在运行第二位代码之前等待0.8秒?

4 个答案:

答案 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];