我开始学习使用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引起的回弹到原始位置之后,它会在最后一微秒内跳回到新位置!)
在最后一分钟让绿箱不跳到新位置的最佳方法是什么?
答案 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:]属性或类似的东西,这是我找到解决这个问题的唯一方法。