error in Button Jiggle algorithm

objective-c, xcode

Solution

You're setting the animation on `self.btnOption1`, so you would need to remove it from `self.btnOption1`:

- (void)stopJiggling {
    [self.btnOption1.layer removeAllAnimations];
    self.btnOption1.transform = CGAffineTransformIdentity;
}

but in fact if you just set the `transform` property of the button again, outside of an animation block, it will remove the animation:

- (void)stopJiggling {
    self.btnOption1.transform = CGAffineTransformIdentity;
}

(This worked in my test project.)

Update:

I notice that you're starting the animation with a delay, and you're calling `stopJiggling` immediately after you call `animateWithDuration:...`. I don't know why you're using a delay or why you're calling `stopJiggling` immediately.

I created a test case to match your code:

@implementation ViewController {
    __unsafe_unretained IBOutlet UIButton *btnOption1;
}

- (IBAction)startJiggling {
    btnOption1.transform = CGAffineTransformMakeRotation(-.1);
    [UIView animateWithDuration:.1 delay:2 * 0.08 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{
        btnOption1.transform = CGAffineTransformMakeRotation(.1);
    } completion:nil];
    [self stopJiggling];
}

- (void)stopJiggling {
    [btnOption1.layer removeAllAnimations];
    btnOption1.transform = CGAffineTransformIdentity;
}

@end

I hooked up my `btnOption1` ivar to a button, and connected the button to the `startJiggling` method. With the code as shown, clicking the button does nothing, because the animation is removed immediately after it is added. If I comment out the `removeAllAnimations` message, clicking the button makes the button start jiggling and it jiggles forever. I tested on the iPhone 4.3 simulator, the iPhone 5.0 simulator, the iPhone 5.1 simulator, and my iPhone 4S running iOS 5.1.

So, I could not reproduce your problem. Sending `removeAllAnimations` removes the animation in my test.

I suspect that you just want the animation to repeat twice and then stop (since you have an argument named `count` and you're passing 2). If that's what you want to do, you can do it like this:

- (IBAction)startJiggling {
    btnOption1.transform = CGAffineTransformMakeRotation(-.1);
    [UIView animateWithDuration:.1 delay:2 * 0.08 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{
        [UIView setAnimationRepeatCount:2];
        btnOption1.transform = CGAffineTransformMakeRotation(.1);
    } completion:^(BOOL completed){
        btnOption1.transform = CGAffineTransformIdentity;
    }];
}

You set the repeat count inside the animation block using `+[UIView setAnimationRepeatCount:]`, and you restore the button's transform in the completion block.

Problem

i have impletemented a button jiggle animation.where pressing a button wobbles ,but the problem is the animation does'nt stop and getting an error in [self.layer removeAllAnimations]; below is the code; ``` -(IBAction)button1Clicked:(id)sender { UIButton *no1 =sender; output= [self answerCheck:no1.titleLabel.text]; self.label.text=output; [self enableOptions:NO]; [self loadingView]; [self startJiggling:2]; } - (void)startJiggling:(NSInteger)count { CGAffineTransform leftWobble = CGAffineTransformMakeRotation(degreesToRadians( kAnimationRotateDeg * (count%2 ? +1 : -1 ) )); CGAffineTransform rightWobble = CGAffineTransformMakeRotation(degreesToRadians( kAnimationRotateDeg * (count%2 ? -1 : +1 ) )); CGAffineTransform moveTransform = CGAffineTransformTranslate(rightWobble, -kAnimationTranslateX, -kAnimationTranslateY); CGAffineTransform conCatTransform = CGAffineTransformConcat(rightWobble, moveTransform); self.btnOption1.transform = leftWobble; // starting point [UIView animateWithDuration:0.1 delay:(count * 0.08) options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{ self.btnOption1.transform = conCatTransform; } completion:nil]; [self stopJiggling]; } -(void)stopJiggling { [self.btnOption1.layer removeAllAnimations]; self.btnOption1.transform = CGAffineTransformIdentity; // Set it straight } ```

Original source