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

向循环UIView动画块添加随机性

苏华荣
2023-03-14

我正在尝试使用animateWithDuration:方法在iOS中制作动画。

我在屏幕上移动一个图像(UIImageView中一个云的简单图片),然后让动画循环运行,我想在每次穿过屏幕时改变速度(持续时间)。

我试过几种方法,但都不适合我。

我首先想到我可以使用UIViewAnimationOption重复如下:

[UIImageView animateWithDuration:arc4random() % 10 + 1
                           delay:0.0
                         options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionRepeat
                      animations:^{
 //moving the cloud across the screen here
}
completion:^(BOOL finished) {
    NSLog(@"Done!");
}];

但这似乎并没有再次调用arc4Anywhere()来重置持续时间...也就是说,只有当应用html" target="_blank">程序启动时,云才会以随机的速度穿过屏幕,而不是每次动画循环时。

然后我尝试使用完成块再次启动动画,如下所示:

-(void)animateMethod
{
[UIImageView animateWithDuration:arc4random() % 10 + 1
                           delay:0.0
                         options:UIViewAnimationOptionCurveLinear
                      animations:^{
 //moving the cloud across the screen here
}
completion:^(BOOL finished) {
    NSLog(@"Done!");
    [self animateMethod];
}];
}

这给了我想要的效果,但当我使用导航控制器推到另一个视图时,完成块似乎会在一个无休止的循环中被触发(我的日志会被垃圾短信“Done!”)

有人知道如何达到预期效果吗?我想要正确的方法?

共有1个答案

陈德泽
2023-03-14

你走在正确的轨道上。关键是你只需要在动画完成的时候循环,而不是在动画失败的时候。所以在告诉它循环之前,你需要检查<代码>完成的BOOL是否正确。

-(void)animateMethod
{
    [UIImageView animateWithDuration:arc4random() % 10 + 1
                               delay:0.0
                             options:UIViewAnimationOptionCurveLinear
                          animations:^{
     //moving the cloud across the screen here
    }
    completion:^(BOOL finished) {
        if (finished) {
            NSLog(@"Done!");
            [self animateMethod];
        }
    }];
}

这种方法非常适用于像这样的非常简单的动画,当你一次只做几个,比如3-5朵云时。除此之外,您可能还需要使用NSTimer或CADisplayLink设置自己的动画循环,并调整其中的云帧。这是一种更为手动的方式,但即使在UIKit中,它也会为您提供一些不错的动画。

 类似资料:
  • 我有一个叫波浪的UIView,它有一个漂亮的无尽的“浮动”动画 现在,如果我添加另一个动画,比如说将这个视图移动到不同的位置,“浮动”动画就会停止。这是一个合理的反应,在完成块中再次启动“浮动”是没有问题的。我只是想知道我是否遗漏了什么,也许是在动画选项中,以不相互中断的方式将两者结合起来。 我能够这样做,如果第二个动画是基于CGAffineTransfromScale,它们结合没有问题,但当我移

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

  • 问题内容: 在c ++或c编程语言中,我们知道要使用gotoxy(x,y)来更改坐标,并且可以使用循环和睡眠来更改坐标并制作动画。像这样; 但是我的问题是在JAVAFX 2.0编程中如何?我正在使用netbeans 7.2。感谢您的帮助。 问题答案: 看一下使用时间轴动画。它是JavaFX中动画的关键组成部分, 用于确定动画的关键部分何时以及以什么顺序出现。 这是一个例子

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

  • 我在我正在开发的应用程序中发现了一个奇怪的错误。在我进入细节之前,我将陈述我的问题 1-为什么不能调用UIView动画完成块 2-为什么在显示模式视图后会调用UIView动画完成块? 我有一系列UIView动画,它们在视图控制器出现后开始。他们有完成块。绝大多数情况下,动画完成块都会被调用。但每隔一段时间,应用程序就会进入一种状态,完成块不会被调用。 此外,当我从当前视图控制器模态地呈现一个新的视

  • 每当此动画结束时,我都会尝试调用一个方法,但在某些情况下,例如,当用户离开应用程序时,它的完成块永远不会被调用。此外,当VC与UIView动画同时出现时,完成块永远不会被调用。 即使动画以某种方式中断,我应该如何确保调用回调?我是否应该根本不使用UIView动画完成块,而是使用其他内容?请开导我。。!