1

这是一个绝对初学者的问题(对不起),但我想知道如何提交一个动画,一旦它结束就开始另一个动画。想象一下,将图像从 x=0 移动到 x=300。然后你想再次对同一图像进行动画处理,但这一次是从 x=300 到 x=330,以便它从屏幕上消失。

以下代码只会执行从 x=300 到 x=330 的动画,不会提交动画 x=0 到 x=300。我确定我没有得到 commitAnnimation 的概念,这很明显,但是我将如何一个接一个地制作两个动画呢?

我知道我可以将图像直接移动到 330,但我不希望这样,因为我需要第一个动画 (x 0 - 300) 与另一个动画同步。

这是我的(错误的)代码:

[UIView beginAnimations:@"shadowMove" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[imageView setFrame:CGRectOffset([imageView frame], 300, 0)]; 

[UIView commitAnimations]; // End animations


// Second Animation


[UIView beginAnimations:@"shadowMoveRestAway" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[imageView setFrame:CGRectOffset([imageView frame], 330, 0)]; // Move imageView off screen

[UIView commitAnimations]; // End animations
4

1 回答 1

8

使用委托方法

[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

在第一个动画完成后开始其他事情。所以把你接下来想做的事情放在 animationDidStop:finished:context 方法中,记住 iphone 是一个事件驱动的环境,所以像上面这样的线性代码将几乎同时启动每个动画。

编辑:

我忘了补充一点,您还需要设置动画委托,否则当第一个停止时您将无法获得该事件 - 见下文;

这是带有更改的代码的完整版本 - 我正在使用缩写的 animationDidStop 委托,因为这更容易理解并且适用于本示例。

[UIView beginAnimations:@"shadowMove" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(myFirstAnimationDidStop)];
[imageView setFrame:CGRectOffset([imageView frame], 300, 0)]; 
[UIView commitAnimations]; // End animations

那么你只需要一个这样的新方法;

-(void) myFirstAnimationDidStop {
// Second Animation

[UIView beginAnimations:@"shadowMoveRestAway" context:nil]; 
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[imageView setFrame:CGRectOffset([imageView frame], 330, 0)];
[UIView commitAnimations]; 
}

为了完整起见,您应该在您的界面 (.h) 文件中添加;

-(无效)myFirstAnimationDidStop;

@selector 很简单,它只是指向另一种方法的一种方式——希望这个例子能澄清这一点。

于 2011-03-30T12:27:19.913 回答