多阶段动画使用块

5

我知道你可以使用类似以下方式的块来执行两阶段动画:

[UIView animateWithDuration:25.0 delay:0.0 options:UIViewAnimationCurveLinear animations:
     ^{ 
         aView.alpha = 2.5;         
     } 
         completion:^(BOOL finished)
     {
         aView.hidden = YES; 
     }
 ];

但是我该如何使用块创建多阶段(超过2个)动画呢?


1
多阶段动画真的是 UIKit 中缺失的设计特性。你可以使用 QuartzCore 来实现其中的一些,但并不多。未来应该会有人提出更好的解决方案。 - Alexei Sholik
3个回答

11

使用嵌套动画:

[UIView animateWithDuration:0.5 
                      delay:0.0 
                    options:UIViewAnimationOptionBeginFromCurrentState 
                 animations:^{
                     //first animation
                 }
                 completion:^(BOOL finished){[UIView animateWithDuration:0.5 
                                                                   delay:0.0 
                                                                 options:UIViewAnimationOptionBeginFromCurrentState 
                                                              animations:^{
                                                                  //second animation
                                                              }
                                                              completion:^(BOOL finished){//and so on..
                                                              }];}];

根据苹果文档,嵌套的动画块应该在第一个动画块本身中,而不是在完成处理程序中。虽然这只是一个命名问题。https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6-SW11 - ratsimihah
实际上,苹果也表示这是正确的方法:使用完成处理程序是将多个动画链接在一起的主要方法。 他们在他们的文档中举了 清单4-2 的例子。如果您将嵌套块放在第一个块中,它将与第一个块同时开始,而不是在第一个块的动画结束时开始。 - tipycalFlow
当然。我并不是在反驳这一点,而只是指出了一个命名问题。使用“完成处理程序”和“嵌套块”是两种不同的技术,而你说“使用嵌套块”,同时展示了一个完成处理程序块。这不是什么大问题。 - ratsimihah
我明白了。我所说的“block”是指“代码段”,而不是Objective-C中的“block”,这引起了混淆。我已经编辑了答案。 - tipycalFlow

8

或者您可以采用递归多阶段动画方法:

-(void) multiStageAnimate{
[UIView animateWithDuration:0.5 
                      delay:0.0 
                    options:UIViewAnimationOptionBeginFromCurrentState 
                 animations:^{
                     //animation code
                 }
                 completion:^(BOOL finished){
                     if(/* If terminating condition not met*/)
                         [self multiStageAnimate];
                 }];
}

0

我知道这是一个比较旧的问题,但我想要加入我的意见。

我创建了一个用于处理多阶段动画的类,可以在这里找到。

目前它只支持单一的持续时间和选项设置,但我可能会添加更多功能。

以下是如何使用它:

// Create New Animation
MSAnimation * newAnimation = [MSAnimation newAnimationWithDuration:0.35 andOptions:UIViewAnimationOptionCurveEaseInOut];

// Add Sequence
[newAnimation addNewAnimationStage:^{
    greenView.center = CGPointMake(greenView.center.x, greenView.center.y + 100);
}];
[newAnimation addNewAnimationStage:^{
    greenView.center = CGPointMake(greenView.center.x + 100, greenView.center.y);
}];
[newAnimation addNewAnimationStage:^{
    greenView.center = CGPointMake(greenView.center.x, greenView.center.y + 100);
}];
[newAnimation addNewAnimationStage:^{
    greenView.center = CGPointMake(greenView.center.x - 50, greenView.center.y);
}];
[newAnimation addNewAnimationStage:^{
    greenView.frame = CGRectMake(0, 0, 100, 100);
}];

// Animate Your Sequence With Completion
[newAnimation animateSequenceWithCompletion:^{
    NSLog(@"All finished!");
}];

给您:

Animation Demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接