无法停止动画

时间:2013-02-16 19:26:01

标签: ios animation blink

我使用以下代码使标签中的文字闪烁:

- (void)blinkAnimation:(NSString *)animationID finished:(BOOL)finished target:(UILabel *) target {

   NSString *selectedSpeed = [[NSUserDefaults standardUserDefaults] stringForKey:@"EffectSpeed"];
float speedFloat = (0.50 - [selectedSpeed floatValue]);

   [UIView beginAnimations:animationID context:(__bridge void *)(target)];
   [UIView setAnimationDuration:speedFloat];
   [UIView setAnimationDelegate:self];
   [UIView setAnimationDidStopSelector:@selector(blinkAnimation:finished:target:)];

   if([target alpha] == 1.0f)
       [target setAlpha:0.0f];
  else
       [target setAlpha:1.0f];

   [UIView commitAnimations];
}

我正在使用以下代码制作动画停止:

- (void) stopAnimation{

   [self.gameStatus.layer removeAllAnimations];
}

虽然动画效果很好,但我无法阻止它。

你能帮忙吗?

提前致谢....

1 个答案:

答案 0 :(得分:4)

问题是当您手动停止动画时正在调用animationDidStopSelector,但该方法只是启动另一个动画。因此,您可以将其停止,但您可以立即启动另一个动画。

就个人而言,我建议摆脱animationDidStopSelector并使用动画的自动反转和重复功能:

[UIView beginAnimations:animationID context:nil];
[UIView setAnimationDuration:speedFloat];
[UIView setAnimationDelegate:self];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationRepeatCount:CGFLOAT_MAX];
[target setAlpha:0.0f];
[UIView commitAnimations];

应该修复它,但正如holex所说,你应该使用块动画。我引用文档:"在iOS 4.0及更高版本中不鼓励使用此方法[beginAnimations]。您应该使用基于块的动画方法来指定动画。"

因此,等效的块动画将是:

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
                 animations:^{
                     self.gameStatus.alpha = 0.0;
                 }
                 completion:nil];

无论您使用哪种技术,removeAllAnimations现在都能按预期工作。

另外,当您停止动画时,它会立即将alpha设置为零。停止重复动画然后将alpha从当前值设置为所需的最终值可能更为优雅。要做到这一点,您需要从表示层抓取当前opacity,然后将alpha从该动画设置为您希望它停止的任何内容(在我的示例1.0中,但您可以也使用0.0):

CALayer *layer = self.gameStatus.layer.presentationLayer;
CGFloat currentOpacity = layer.opacity;

[self.gameStatus.layer removeAllAnimations];

self.gameStatus.alpha = currentOpacity;
[UIView animateWithDuration:0.25
                 animations:^{
                     self.gameStatus.alpha = 1.0;
                 }];