iphone连续动画

时间:2011-04-01 10:03:54

标签: iphone objective-c cocoa-touch animation

我想知道实现一系列不同动画的最佳方法是什么。例如,如果我调用以下方法并尝试向右,向左和向上设置同一对象的动画,它将无法工作,因为编译器不会以线性方式处理它们,并且我最终得到了我的对象只是上去(跳过左右两步):

    -(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。但说实话,这是非常令人困惑的,而不是一个非常清晰的编码方法。无论如何要获得一个更像“线性”的代码,就像我在开头建议的那样(这不起作用),或者我只需要使用选择器方法吗?

感谢您的任何建议!

2 个答案:

答案 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中详细阐述了这个主题。