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

Posted

技术标签:

【中文标题】添加延迟动画时,UIView 动画不起作用【英文标题】:UIView animations do not work when a delayed animation is added 【发布时间】: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 中设置动画(而是直接跳到末尾)。

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

【问题讨论】:

【参考方案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];

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

【讨论】:

以上是关于添加延迟动画时,UIView 动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥在添加视图后立即启动 UIView 动画不起作用?

UIView 块动画不起作用

视图不在屏幕时的 UIView 动画 alpha 不起作用

UIView 开始动画不起作用

UIView subView alpha 动画不起作用

UIView animateKeyframes 不起作用