【问题标题】:UIView animations do not work when a delayed animation is added添加延迟动画时,UIView 动画不起作用
【发布时间】:2013-05-23 17:29:30
【问题描述】:

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

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

【问题讨论】:

    标签: ios uiview uiviewanimation


    【解决方案1】:

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

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

    【讨论】:

    • 前面的命令是动画的,正如你在我添加 alpha 动画时看到的那样。如果第二个动画影响相同的属性,它只是没有动画。另外,正如我所说,我需要能够链接任意数量的动画,具体取决于用户输入。我不能硬核完成块中的序列。
    • 你能详细解释一下你到底想做什么吗?用户的输入是什么,对应的结果应该是什么?
    • 用户将触摸任意数量的区域。提交答案后,会出现一只手,指出他们选择的不适用的领域中他们错过的领域。我有一个解决方案,现在。我今天会发布它。
    【解决方案2】:

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

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

    @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];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多