当前位置: 首页 > 知识库问答 >
问题:

未调用UIView动画完成块

乐山
2023-03-14

我在我正在开发的应用程序中发现了一个奇怪的错误。在我进入细节之前,我将陈述我的问题

1-为什么不能调用UIView动画完成块

2-为什么在显示模式视图后会调用UIView动画完成块?

我有一系列UIView动画,它们在视图控制器出现后开始。他们有完成块。绝大多数情况下,动画完成块都会被调用。但每隔一段时间,应用程序就会进入一种状态,完成块不会被调用。

此外,当我从当前视图控制器模态地呈现一个新的视图控制器时,之前未调用的动画完成块都会被调用。

一旦应用程序处于这种状态,动画完成块将不再被调用,除非我再次呈现模式视图。

我的动画块基本上是这样的:

 int i = 0;
 for (UIView *view in self.cellImageViews)
 {
     [UIView animateWithDuration:CELL_ANIMATION_DISMISS_DURATION
                           delay:(i)*CELL_ANIMATION_STAGGER_INTERVAL
                         options:UIViewAnimationOptionCurveEaseIn
                      animations:^{
                          view.transform = CGAffineTransformTranslate(view.transform, 0, CELL_ANIMATION_DISMISS_TRANSLATION);
                      } completion:^(BOOL finished) {
                         NSLog(@"Animation Completed: i:%d, finished:%d, count%d",i,finished,[self.oldCellImageViews count])
                         if(finished && (i == ([self.cellImageViews count]-1)))
                         {
                            NSLog(@"if statement passed");
                            // My completion block stuff goes here
                         } 
                       }             
         ];
        i++;
    }

共有2个答案

桓瀚
2023-03-14

CALayer动画不是排队的,而是复合的。在当前的方法中,您正在安排一些动画在前一个或多个动画没有机会完成之前开始。

如果您确实想对CALayer动画进行排队,您还有其他选项,其中一些选项包括:

  1. 在前一个的完成^块(链接)中触发新动画。
  2. 使用委托并在-AnimationddStop:完成:中触发新动画。
  3. 您可能会在紧要关头逃脱UIViewAnimationOptionStart inFromMONtState

真正的解决方案不是使用动画,而是使用动画。

周飞
2023-03-14

尝试以下操作

[UIView animateWithDuration:CELL_ANIMATION_DISMISS_DURATION
                      delay:(i)*CELL_ANIMATION_STAGGER_INTERVAL
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                     int i = 0;

                     for (UIView *view in self.cellImageViews)
                     {
                         view.transform = CGAffineTransformTranslate(view.transform, 0, CELL_ANIMATION_DISMISS_TRANSLATION);
                         i++;
                     }

                 } completion:^(BOOL finished) {
                     if(finished)
                     {
                         NSLog(@"if statement passed");
                         // My completion block stuff goes here
                     }
                 }
 ];
 类似资料:
  • 每当此动画结束时,我都会尝试调用一个方法,但在某些情况下,例如,当用户离开应用程序时,它的完成块永远不会被调用。此外,当VC与UIView动画同时出现时,完成块永远不会被调用。 即使动画以某种方式中断,我应该如何确保调用回调?我是否应该根本不使用UIView动画完成块,而是使用其他内容?请开导我。。!

  • 我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种

  • 非常简单的动画: 动画工作得很好。但是,完成块被调用了两次。这也很好,我知道我需要检查布尔值,看看它是否真的完成了。嗯,不仅完成块被调用了两次,而且两次都完成了。 我怎么知道动画是否真的完成了?

  • 我正在为数组中的每个UIView设置动画,我想知道所有动画何时完成。例如:我用一个简单的缩放动画在ViewController上显示10个UIView,每个UIView都有一个小延迟。在所有10个动画完成后,我想在完成块中再做一个动画。 我如何知道所有动画何时完成?

  • 我有一个动画块来执行一个简单的基于变换的动画,在完成时从它的超级视图中删除有问题的视图。 然后我使用Tech Q详述的代码 但是,此代码不会阻止完成代码的执行。因此,为了防止代码执行,我将完成代码更改为: 当检查finished==TRUE时,动画块暂停时,将阻止执行完成代码。如果在“取消暂停”动画之前超过持续时间,则不会执行完成代码。即在本例中,msgView仍保留在superview中。 是否

  • 我有一段代码,可以为UIImage的位置设置动画,但是过渡没有设置动画,而是位置会立即改变。我不认为这是一个代码问题,因为相同的代码在另一个项目上工作,但我无法找出其他错误。 alpha会动画,而y位置不会。我的约束如下所示 编辑:我正在使用针对8.4的Xcode-Beta 7