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

UIView动画有持续时间不尊重延迟

贲培
2023-03-14

我想安排一系列动画,在屏幕上动画介绍文字。最后一个动画在完成时,应该触发运行游戏的游戏勾号逻辑。

出于某种原因,一切都在立即发生。有人能解释为什么会发生这种情况吗?或者有更好的选择吗?

[self.view bringSubviewToFront:_ViewIntroSeconds];

[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut
                 animations:^(void) {
                     [_IntroLabel1 setAlpha:1];
                 }
                 completion:^(BOOL finished){
                 }];

[UIView animateWithDuration:0.4 delay:3.0 options:UIViewAnimationOptionCurveEaseInOut
                 animations:^(void) {
                     [_IntroLabel2 setAlpha:1];
                     [_IntroLabel1 setAlpha:0];
                     [_IntroLabel1 setCenter:CGPointMake(0, _IntroLabel1.center.y)];
                 }
                 completion:^(BOOL finished){
                 }];

[UIView animateWithDuration:0.4 delay:5.0 options:UIViewAnimationOptionCurveEaseInOut
                 animations:^(void) {
                     [_IntroLabel3 setAlpha:1];
                     [_IntroLabel2 setAlpha:0];
                     [_IntroLabel2 setCenter:CGPointMake(0, _IntroLabel2.center.y)];
                 }
                 completion:^(BOOL finished){
                     [self updateGame];
                     [self updateClock];

                     [_ViewIntroSeconds setAlpha:0];
                 }];

共有1个答案

岳承悦
2023-03-14

我的建议是将延迟设置为0,然后将后续的UIView动画块放在前面的animateWithDuration语句的completion块中:

[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut
                 animations:^(void) {
                     [_IntroLabel1 setAlpha:1];
                 }
                 completion:^(BOOL finished){
                     [UIView animateWithDuration:0.4 delay:2.6 options:UIViewAnimationOptionCurveEaseInOut
                                      animations:^(void) {
                                          [_IntroLabel2 setAlpha:1];
                                          [_IntroLabel1 setAlpha:0];
                                          [_IntroLabel1 setCenter:CGPointMake(0, _IntroLabel1.center.y)];
                                      }
                                      completion:^(BOOL finished){
                                          [UIView animateWithDuration:0.4 delay:1.6 options:UIViewAnimationOptionCurveEaseInOut
                                                           animations:^(void) {
                                                               [_IntroLabel3 setAlpha:1];
                                                               [_IntroLabel2 setAlpha:0];
                                                               [_IntroLabel2 setCenter:CGPointMake(0, _IntroLabel2.center.y)];
                                                           }
                                                           completion:^(BOOL finished){
                                                               [self updateGame];
                                                               [self updateClock];

                                                               [_ViewIntroSeconds setAlpha:0];
                                                           }];
                                      }];
                 }];

这会给你想要的效果。

编辑:发生这种情况的原因是,UIView animateWithDurationblock开始动画,并在动画仍然有效时继续执行以下代码。因此,建议在完成块中执行“下一个”动画效果。否则,几乎会立即执行所有持续时间为animateWithDuration的请求。

编辑2:我编辑了块中的延迟,分别给你0、3和5秒的“错觉”。

 类似资料:
  • 我在动画制作方法上有问题 我已经为GoogleMap创建了自己的CalloutBubble 在我的视图控制器中,我创建属性 然后,如果我尝试用任何方法创建calloutView,所有这些都可以很好地处理动画,但如果我用Google map方法返回视图 我的动画会立即在calloutView中运行,也会立即调用completion,然后再次调用runningLabel方法,因此它不会像必须的那样工作

  • 我不知道如何在iOS7中设置NSLayoutConstraint动画持续时间。这是我的代码:

  • UIView animateWithDuration的文档称,在动画期间,所有用户交互都被阻止。但我想知道它是否也会在预动画延迟期间阻塞。 文件上说 “在动画制作过程中,将暂时禁用正在制作动画的视图的用户交互。(在iOS 5之前,将禁用整个应用程序的用户交互。)如果希望用户能够与视图交互,请在选项参数中包含UIViewAnimationOptionAllowUserInteraction常量。"

  • 我有一个CollectionView,我想在用户选择的CollectionViewCell内创建一个动画。我选择使用animateKeyframesWithDuration,因为我想一步一步地创建自定义动画。我的代码如下所示: 选中此选项后,将在自定义CollectionViewCell内执行。问题是我想强制在某个特定点立即停止动画。但当我这样做时,动画并没有完全停止,它只是将剩余的动画移动到另一

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

  • 我最近发现了一些UIView动画代码,并注意到它没有正确使用animateKeyframesWithDuration:delay:options:animations:completion:方法,并且一直在尝试修复它,但由于某些原因,动画不完全相同。 以下是我找到的代码: 这有两个问题: 应该真正使用关键帧动画,而不是在完成块中嵌套动画 使用animateKeyframesWithDuration