iPhone:如何一个接一个地提交两个动画

n.e*_*ind 1 iphone animation cocoa-touch uiviewanimation

这是一个绝对的初学者的问题(对不起),但我想知道如何提交一个动画,一旦它已经结束,开始另一个动画.想象一下,图像从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
Run Code Online (Sandbox Code Playgroud)

Rog*_*ger 8

使用委托方法

[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
Run Code Online (Sandbox Code Playgroud)

在第一个动画完成时开始其他操作.所以在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
Run Code Online (Sandbox Code Playgroud)

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

-(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]; 
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)myFirstAnimationDidStop;

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