添加延迟动画时,UIView动画不起作用

时间:2013-05-23 17:29:31

标签: ios uiview uiviewanimation

我试图移动UILabel两次,但我的行为很奇怪。这是我的第一部动画:

- (IBAction)doAnimation:(id)sender
{
    CGRect labelFrame = self.label.frame;
    CGRect newFrame = CGRectMake((random() / (float)RAND_MAX) * self.view.frame.size.width,
                                 (random() / (float)RAND_MAX) * self.view.frame.size.height,
                                 labelFrame.size.width,
                                 labelFrame.size.height);
    [UIView animateWithDuration:2
                          delay:0
                        options:0
                     animations:^{
                         self.label.frame = newFrame;
                     }
                     completion:NULL];
}

这完美无缺。标签在移动到位时会逐渐消失。

然后我通过在doAnimation:

末尾添加此代码添加了第二个延迟动画
    CGRect newFrame2 = CGRectMake((random() / (float)RAND_MAX) * self.view.frame.size.width,
                          (random() / (float)RAND_MAX) * self.view.frame.size.height,
                          labelFrame.size.width,
                          labelFrame.size.height);
    [UIView animateWithDuration:2
                          delay:3
                        options:0
                     animations:^{
                         self.label.frame = newFrame2;
                     }
                     completion:NULL];

在这种情况下,我得到了不同的行为。标签跳转到第一个动画的结尾,等待延迟,然后动画第二个动作。

出于好奇,我尝试在动画1中动画两个属性。

animations:^{
                 self.label.frame = newFrame;
                 self.label.alpha = 1.0f;
             }

alpha动画正确,但帧更改没有。

如果我在动画2中添加了alpha更改,那么alpha不会在动画1中设置动画(而只是跳转到结尾)。

是否可以使用延迟动画在类似属性上创建动画序列?我需要将其扩展为任意数量的动画,具体取决于用户输入。

2 个答案:

答案 0 :(得分:0)

执行此动画是异步的,即给出动画命令,程序流程继续 此外,如果在前一个命令尚未完成时为视图给出动画命令,则完成上一个命令而不进行任何动画并执行新动画。

我认为你应该把第二个动画代码放在第一个动画的完成块中,你当前正在为它传递NULL。 completion在执行动画后执行,此时你想开始我的第二个动画。

答案 1 :(得分:0)

我找到了解决方案。在这里。

我添加了一个数组来保存任意数量的坐标以指向。

@property (nonatomic, retain) NSMutableArray* animationCoordinates;

然后我在启动动画序列之前将视图添加到数组中。

我还添加了一种方法来启动下一个动画。

- (void)playNextAnimation
{
    if (self.animationCoordinates.count > 0)
    {
        CGPoint point = [[self.animationCoordinates objectAtIndex:0] CGPointValue];
        CGRect labelFrame = self.label.frame;
        CGRect newFrame = CGRectMake(point.x,
                                     point.y,
                                     self.originalHandFrame.size.width,
                                     self.originalHandFrame.size.height);
        [self animateWithDuration:2.0
                            delay:0.0
                       animations:^{
                           self.label.frame = newFrame;
                           self.label.alpha = 1.0f;
                       }
                       completion:^(BOOL success){
                           [self playNextAnimation];
                       }];
        [self.buttonsToAnimate removeObjectAtIndex:0];
    }
}

当我想开始制作动画时,我只需要打电话

[self playNextAnimation];

按顺序播放动画,直到所有点都被访问过。