2

我试图移动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 中设置动画(而只是跳到末尾)。

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

4

2 回答 2

0

执行这个动画是一个异步的事情,即给出动画的命令,程序流程继续。
此外,如果在前一个命令尚未完成时对视图给出了动画命令,则前一个命令在没有任何动画的情况下完成,并执行新的动画。

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

于 2013-05-23T19:50:14.200 回答
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];

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

于 2013-05-24T14:49:04.650 回答