4

ボタンジグルアニメーションを完成させました。ボタンを押すとぐらつきますが、問題はアニメーションが停止せず、[self.layerremoveAllAnimations]でエラーが発生することです。以下はコードです。

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

アニメーションをに設定している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

ivarbtnOption1をボタンに接続し、ボタンをstartJigglingメソッドに接続しました。示されているコードでは、アニメーションは追加された直後に削除されるため、ボタンをクリックしても何も起こりません。メッセージをコメントアウトするとremoveAllAnimations、ボタンをクリックするとボタンが揺れ始め、永遠に揺れます。私はiPhone4.3シミュレーター、iPhone 5.0シミュレーター、iPhone 5.1シミュレーター、およびiOS5.1を実行しているiPhone4Sでテストしました。

だから、私はあなたの問題を再現することができませんでした。送信removeAllAnimationsすると、テストのアニメーションが削除されます。

アニメーションを2回繰り返してから停止したいのではないかと思います(という名前の引数があり、count2を渡しているため)。それがあなたがしたいことであるならば、あなたはこのようにそれをすることができます:

- (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 に答える