setAnimationRepeatAutoreverses表现不像我预期的那样

时间:2010-03-25 14:12:32

标签: iphone core-animation

我开始学习使用UIView动画。所以我写了以下几行:

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:2.0];
[UIView setAnimationRepeatCount:2];
[UIView setAnimationRepeatAutoreverses:YES];

CGPoint position = greenView.center;
position.y = position.y + 100.0f;
position.x = position.x + 100.0f;
greenView.center = position;

[UIView commitAnimations];

在这种情况下,UIView(一个绿色的盒子)向后移动了2次。到目前为止一切都那么好,但我发现在移动两次后,绿色框最终跳到“新位置”(position.x + 100.0f,position.y + 100.0f)而不是回到原来的位置(position.x,position.y)。这使得动画看起来很奇怪(就像在setAnimationRepeatAutoreverses引起的回弹到原始位置之后,它会在最后一微秒内跳回到新位置!)

在最后一分钟让绿箱不跳到新位置的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我发现使用偶数为setAnimationDuration将结束重复动画到其初始位置,然后在重复动画结束后弹出到最终位置。如果我将setAnimationDuration设置为半周期,则重复动画将结束到最终位置。与使用setAnimationDidStopSelector:方法相比,这是处理动画的一种更简洁的方法。

// Repeat Swimming
CGPoint position = swimmingFish.center;
position.y = position.y - 100.0f;
position.x = position.x - 100.0f;

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:1.0f];
[UIView setAnimationRepeatCount:2.5];
[UIView setAnimationRepeatAutoreverses:YES];

swimmingFish.center = position;

答案 1 :(得分:1)

我在alpha属性上使用UIView动画时遇到了完全相同的问题。最糟糕的是动画在发送animationDidStop:delegate消息之前跳转到“最终”位置,这意味着你无法在那里手动设置原始状态。

我的解决方案是使用animationDidStop委托消息来创建一个新的动画块,并将它们全部串在一起:

- (void)performAnimation
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(phase1AnimationDidStop:finished:context:)];

    // Do phase 1 of your animations here
    CGPoint center = someView.center;
    center.x += 100.0;
    center.y += 100.0;
    someView.center = center;

    [UIView commitAnimations];
}

- (void)phase1AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(phase2AnimationDidStop:finished:context:)];

    // Do phase 2 of your animations here
    CGPoint center = someView.center;
    center.x -= 100.0;
    center.y -= 100.0;
    someView.center = center;

    [UIView commitAnimations];
}

- (void)phase2AnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    // Perform cleanup (if necessary)
}

您可以通过这种方式将尽可能多的动画块串在一起。这似乎是代码浪费,但直到Apple给我们 - [UIView setAnimationFinishesInOriginalState:]属性或类似的东西,这是我找到解决这个问题的唯一方法。