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

iPhone:如何一个接一个地提交两个动画,iphone,cocoa-touch,animation,uiviewanimation,Iphone,Cocoa Touch,Animation,Uiviewanimation,这是一个绝对初学者的问题(对不起),但我想知道如何提交一个动画,并在动画结束后开始另一个动画。想象一下,将图像从x=0移动到x=300。然后,您希望再次为同一图像设置动画,但这次是从x=300到x=330,以便它从屏幕上消失 以下代码将只执行从x=300到x=330的动画,而不会提交从x=0到x=300的动画。我肯定我不明白“合作动画”的概念,这是显而易见的,但我该如何一个接一个地制作两个动画呢 我知道我可以直接将图像移动到330,但我不希望这样,因为我需要第一个动画(x0-300)与另一个动画

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

以下代码将只执行从x=300到x=330的动画,而不会提交从x=0到x=300的动画。我肯定我不明白“合作动画”的概念,这是显而易见的,但我该如何一个接一个地制作两个动画呢

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

这是我的(错误)代码:


使用委托方法

[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)文件中添加

-(无效)我的第一个动画停止


@选择器很简单,它只是指向另一个方法的一种方式-希望这个示例能够澄清这一点。

使用委托方法

[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)文件中添加

-(无效)我的第一个动画停止


@选择器很简单,它只是指向另一个方法的一种方式-希望这个示例能够澄清这一点。

谢谢!我想试试这个。在这种情况下,是否也可以简单地调用另一个方法,例如[UIView secondAnimation:nil];然后定义另一个方法,在这里我有第二个动画?这似乎比使用@selector要容易得多(至少在我的初学者看来是这样)(我不知道这应该如何工作)?很抱歉提出这样的问题,非常感谢您的回答。请参阅更新的答案-我忘记您也需要设置动画代理,但我现在为您提供了一个完整的示例。希望能有帮助。你真是太好了。你让我高兴极了!谢谢我想试试这个。在这种情况下,是否也可以简单地调用另一个方法,例如[UIView secondAnimation:nil];然后定义另一个方法,在这里我有第二个动画?这似乎比使用@selector要容易得多(至少在我的初学者看来是这样)(我不知道这应该如何工作)?很抱歉提出这样的问题,非常感谢您的回答。请参阅更新的答案-我忘记您也需要设置动画代理,但我现在为您提供了一个完整的示例。希望能有帮助。你真是太好了。你让我高兴极了!