13

UIButton をアニメーション化しようとしています。ただし、アニメーション中は、UIButton とのやり取りはありません。期待される動作は、移動中にボタンをクリックできることです。UIButton とアニメーションのコード スニペットは次のとおりです。

UIImage *cloudImage = [UIImage imageNamed:@"sprite.png"];    
UIButton moveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[moveBtn setFrame:CGRectMake(0.0, 80.0, cloudImage.size.width, cloudImage.size.height)];
[moveBtn setImage:cloudImage forState:UIControlStateNormal];
[moveBtn addTarget:self action:@selector(hit:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:moveBtn];
CGPoint newLeftCenter = CGPointMake( 300.0f + moveBtn.frame.size.width / 2.0f, moveBtn.center.y);
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:5.0f];
[UIView setAnimationRepeatCount:HUGE_VALF];
moveBtn.center = newLeftCenter;
[UIView commitAnimations];

hitセレクターは、ボタンが応答するかどうかを示す NSLog を表示するだけです。どんな助けでも大歓迎です。

4

5 に答える 5

29

アニメーション オプションを に設定してみてくださいUIViewAnimationOptionAllowUserInteraction

[UIView animateWithDuration:.2
                      delay: 0
                    options: UIViewAnimationOptionAllowUserInteraction
                 animations:^{ 
                     // animation logic
                 }
                 completion:^(BOOL completed) { 
                     // completion logic
                 }
 ];
于 2011-06-14T15:53:33.467 に答える
13

これについて最近ここにいくつかの質問がありました。アニメーションは純粋にビジュアルです。アニメーションが完了するまで、古いフレームでボタンをタップできます。アニメーションが完了すると、実際のボタンがジャンプします。

編集:

この答えは私が言及していたものです。どうやらNSTimerでボタンを手動で移動する必要があります。詳細については、リンクされた質問/回答を参照してください。

他の人々はUIViewAnimationOptionAllowUserInteraction、UIViewAnimation オプションとして渡すことを提案しています。

于 2011-06-14T15:52:22.077 に答える
0

もう 1 つのオプションは、アニメーション化するボタンの上に透明なボタンを追加することです。特定のケースでは、ボタンを移動しているため、これを使用できない場合がありますが、開始位置から最終位置までをカバーするのに十分な大きさのオーバーレイ ボタンを作成できる場合があります。

私はこの問題を抱えていましたが、私の場合は UIViewAnimationOptionAllowUserInteraction を使用しても機能しませんでした。UIBarButtonItem (initWithCustomView: で作成) 内の UIButton のアルファをアニメーション化して、脈動効果を作成していましたが、そのオプションは機能しません。私は NSTimer オプションも好きではない (スムーズではない) ので、最終的にオーバーレイ ボタンを追加しました。これは好きではありませんが、問題なく動作します。

于 2014-05-12T11:14:06.917 に答える
0

この問題は、ブロックごとのアニメーションが大きいために発生します。上記で提案したような NSTimer ベースのソリューションを作成しましたが、うまくいきました...ただし、動きはぎくしゃくしていました (すべてのタイマー イベント トリガー内にアニメーションを挿入しない限り)。

とにかくアニメーションが必要だったので、タイマーを必要としない解決策を見つけました。それは短い距離しかアニメーション化しないため、ボタンのクリックはまだ正確ですが、私の場合は UI では非常に目立たない小さなエラーのみであり、パラメータに応じて減らすことができます。

任意の時点での誤差は < 15.0 であることに注意してください。これは、アニメーション速度の要件に応じて、より正確にするために減らすことができます。継続時間を短縮して速度を上げることもできます。

- (void)conveyComplete:(UIView*)v
{
    [self convey:v delay:0];
}

- (void)convey:(UIView*)v delay:(int)nDelay
{
    [UIView animateWithDuration:.5 
                          delay:nDelay
                        options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)  
                     animations: ^
                    {
                        CGRect rPos = v.frame; 
                        rPos.origin.x -= 15.0;
                        v.frame = rPos;
                    }
                    completion: ^(BOOL finished)
                    {
                        [self conveyComplete:v];
                    }];

}
于 2011-09-02T05:33:30.643 に答える