我想知道实现一系列不同动画的最佳方法是什么。例如,如果我调用以下方法并尝试向右,向左和向上设置同一对象的动画,它将无法工作,因为编译器不会以线性方式处理它们,并且我最终得到了我的对象只是上去(跳过左右两步):
-(IBAction)clickStart
{
[self Animation1];
[self Animation2];
[self Animation3];
}
现在我可以做到这一点,但它对我来说感觉很麻烦和怪异。考虑这是Animation1的方法:
[pageShadowView setFrame:CGRectMake(100, 0, CGRectGetWidth(pageShadowView.frame), CGRectGetHeight(pageShadowView.frame))];
[UIView beginAnimations:@"Animation1" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(Animation2)];
[pageShadowView setFrame:CGRectMake(200, 0, CGRectGetWidth(pageShadowView.frame), CGRectGetHeight(pageShadowView.frame))];
[UIView commitAnimations]; // End animations
然后我可以在Animation2中做同样的事情,即一旦完成就调用Animation3。但说实话,这是非常令人困惑的,而不是一个非常清晰的编码方法。无论如何要获得一个更像“线性”的代码,就像我在开头建议的那样(这不起作用),或者我只需要使用选择器方法吗?
感谢您的任何建议!
答案 0 :(得分:10)
如果您不必支持iOS< 4:
[UIView animateWithDuration:0.2 animations:^{
// animation 1
} completion:^(BOOL finished){
[UIView animateWithDuration:0.2 animations:^{
// animation 2
} completion^(BOOL finished){
[UIView animateWithDuration:0.2 animations:^{
// animation 3
}];
}];
}]
答案 1 :(得分:2)
我们使用块(CPAnimationSequence on Github)以声明方式创建了一个用于链接动画步骤的组件。
它为您提供了非常易读的代码,如下所示:
[[CPAnimationSequence sequenceWithSteps:
[CPAnimationStep for:0.25 animate:^{ self.imageView.alpha = 0.0; }],
[CPAnimationStep for:0.25 animate:^{ self.headline.alpha = 0.0; }],
[CPAnimationStep for:0.25 animate:^{ self.content.alpha = 0.0; }],
[CPAnimationStep after:1.0 for:0.25 animate:^{ self.headline.alpha = 1.0; }],
[CPAnimationStep for:0.25 animate:^{ self.content.alpha = 1.0; }],
nil]
runAnimated:YES];
与通常的基于块的方法(由Max描述)相比,它具有匹配意图及其表示的优点:动画步骤的线性序列。我们在an article on our iOS development blog中详细阐述了这个主题。