首次结束动画后触发其他动画(Objective-C)

时间:2010-04-26 03:10:17

标签: iphone objective-c core-animation

我有一个简单的动画,只需修改按钮的位置:

[UIView beginAnimation:nil context:nil];
[UIView setAnimationsDuration:3.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
mybutton.frame = CGREctMake(20, 233, 280, 46);
[UIView commitAnimations];

我想在这个完成后执行其他一些动画,怎么做?

4 个答案:

答案 0 :(得分:5)

您可以查看setAnimationBeginsFromCurrentState:。所有动画都在自己的线程中运行,因此[UIView commitAnimations]是非阻塞调用。所以,如果你在提交第一个动画后立即开始另一个动画,在适当地设置它是否从当前状态开始之后,我想你会得到你想要的行为。即:

[UIView beginAnimation:nil context:nil];
// set up the first animation
[UIView commitAnimations];

[UIView beginAnimation:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:NO];
// set up the second animation
[UIView commitAnimations];

或者,您可以通过执行类似

的操作来提供回调
[UIView beginAnimation:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)
// set up the first animation
[UIView commitAnimations];

//...

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    // set up the second animation here
}

答案 1 :(得分:1)

使用+ [UIVIew setAnimationDelegate:]和+ [UIView setAnimationDidStopSelector:]方法将您的类配置为在动画结束时接收消息。

答案 2 :(得分:1)

用于获取开始的代码段..设置初始(第一个)动画:

- (void) aniPath:(AnimationPath *) path
{   
    [UIView beginAnimations:path->aniname context:path];
    [UIView setAnimationDuration:path->interval];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(aniDone:finished:context:)];

    // your initial animation

    [UIView commitAnimations];
}

在完成第一个动画时链接到另一个动画:

- (void) aniDone:(NSString *) aniname finished:(BOOL) finished context:(void *) context
{
    AnimationPath *path = (AnimationPath *) context;
    if ([aniname isEqualToString:path->aniname]) {
        [UIView beginAnimations:path->aniname context:context];
        [UIView setAnimationDuration:path->interval];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(aniDone:finished:context:)];

        // more animations, even recursively 

        [UIView commitAnimations];          
    }
}

答案 3 :(得分:1)

这很容易。

你可以

- (void)animationDidContiune:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    UIView *currentObj = context;
    [self callTheAnimation: currentObj];
}

您可以轻松循环动画。

要结束它 - 我会创建一个animationDidEnded并使用它而不是animationDidContiune 一旦你想要停止它(就像在动画中选择要么连续或结束一样简单)。

HF。

什么是重要的:

使用这种类型的动画制作方法:

- (void)callTheAnimation:(UIView*)itemView
{

    [UIView beginAnimations:@"animation" context:itemView];
        .
        .
        .
}

它们非常灵活 - 由于对象的层次结构,您可以在此处设置动画。