4

我已经实现了一个按钮抖动动画。按下按钮会摇晃,但问题是动画不会停止并在 [self.layer removeAllAnimations] 中出现错误;下面是代码;

 -(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 
}
4

2 回答 2

4

您将动画设置为 on self.btnOption1,因此您需要将其从 中删除self.btnOption1

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

但实际上,如果您只是在transform动画块之外再次设置按钮的属性,它将删除动画:

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

(这在我的测试项目中有效。)

更新:

我注意到您正在延迟启动动画,并且您stopJiggling 调用animateWithDuration:.... 我不知道您为什么要使用延迟或为什么要stopJiggling立即致电。

我创建了一个测试用例来匹配您的代码:

@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

我将我的btnOption1ivar 连接到一个按钮,并将该按钮连接到该startJiggling方法。使用如图所示的代码,单击按钮不会执行任何操作,因为动画在添加后立即被删除。如果我注释掉该removeAllAnimations消息,单击按钮会使按钮开始抖动并且它会永远抖动。我在 iPhone 4.3 模拟器、iPhone 5.0 模拟器、iPhone 5.1 模拟器和运行 iOS 5.1 的 iPhone 4S 上进行了测试。

所以,我无法重现您的问题。发送removeAllAnimations会删除我测试中的动画。

我怀疑您只是希望动画重复两次然后停止(因为您有一个名为的参数count并且您正在传递 2)。如果这就是你想要做的,你可以这样做:

- (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;
    }];
}

使用 设置动画块内的重复计数+[UIView setAnimationRepeatCount:],并在完成块中恢复按钮的变换。

于 2012-07-16T06:59:15.283 回答
0

记得导入 QuartzCore/QuartzCore.h 来与层对话。

于 2013-02-04T16:52:50.340 回答