3

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

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

我尝试了几种方法,但对我来说都表现不正确。

我首先虽然我可以像这样使用 UIViewAnimationOptionRepeat:

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

但这似乎并没有再次调用 arc4random() 来重置持续时间......即云只会在每次启动应用程序时以随机速度穿过屏幕,而不是每次动画循环时。

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

-(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];
}];
}

这给了我我正在寻找的效果,但是当我使用导航控制器推送到另一个视图时,完成块似乎在一个无休止的循环中被触发(我的日志被垃圾邮件“完成!”)

任何人都知道获得所需效果的方法我想要正确的方法吗?

4

1 回答 1

5

你在正确的轨道上。关键是您只需要在动画完成时才循环,而不是在失败时循环。所以你需要finished 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 中它也会为您提供一些不错的动画。

于 2013-01-24T18:30:08.010 回答