Question

I am using the following code to make text in a label 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];
}

and I am using the following code to make the animation Stop :

- (void) stopAnimation{

   [self.gameStatus.layer removeAllAnimations];
}

Although the animation works fine, I cannot stop it.

Could you please help!

Thanks in advance....

Was it helpful?

Solution

The problem is that your animationDidStopSelector is being called when you manually stop your animation, but that method is just starting another animation. So you're stopping it ok, but you're immediately firing off another animation.

Personally, I'd suggest getting rid of the animationDidStopSelector and use the autoreverse and repeat features of the animation:

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

That should fix it, but as holex said, you should use block animation. I quote from the documentation: "Use of this method [beginAnimations] is discouraged in iOS 4.0 and later. You should use the block-based animation methods to specify your animations instead."

So, the equivalent block animation would be:

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

Whichever technique you use, your removeAllAnimations will now work as expected.

As an aside, when you stop animations, it will set alpha immediately to zero. It might be more graceful to stop the repeating animation and then animate the alpha from the current value to your desired final value. To do that, you'll want to grab the current opacity from the presentation layer and then animate alpha from that to whatever you want it to stop at (in my example 1.0, but you could use 0.0, too):

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;
                 }];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top