2011-01-02 11 views
0

私のアプリはマップのようなインターフェースで構成されており、自動ルートを表示する以外は何もしないでください。UIViewのアニメーションがタッチイベントに干渉する

私は塗装された(写真を介して)ルートを持っており、ルートに沿って自動的に移動する "currentPosition"マーカーがアプリケーションにあり、移動の進行状況を示します。

アニメーションはうまくいきますが、ユーザーが画面に触れると(誤ってなど)、アニメーションが完全に間違ったスピードで配置され、狂ったようにちらつくことがあります。

まず、2のコードサンプル:

[UIView animateWithDuration:POINT_MOVEMENT_DURATION 
          delay:POINT_MOVEMENT_DELAY 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         self.currentPosition.center = mp.point; 
        } 
        completion:^(BOOL finished){ 
         NSLog(@"finished animation: %i", finished); 

         [self nextPoint:nil]; 
        } 
    ]; 

nextPointは、次のポイントに移動する機能です。 mpは画面上のピクセル座標を保持する変数です。

このコードを実行するときに今、animatinがログに見えるよう、スムーズに行く:

2011-01-02 15:32:11.006 MAP Player[2258:307] finished animation: 1 
2011-01-02 15:32:14.008 MAP Player[2258:307] finished animation: 1 
2011-01-02 15:32:17.011 MAP Player[2258:307] finished animation: 1 

とすぐに私は画面をタッチすると、これは0に切り替わります。

2011-01-02 15:32:26.642 MAP Player[2258:307] finished animation: 0 
2011-01-02 15:32:26.647 MAP Player[2258:307] finished animation: 0 
2011-01-02 15:32:26.653 MAP Player[2258:307] finished animation: 0 

そして、この時点で、項目が速く移動/点滅します、間違った方向など

私は一つのことが見つかりました:そう、私は[self.view setUserInteractionEnabled:NO];を設定するとちらつきが再び起こることができない、のViewControllerでをそれは間違いなくユーザーのやりとりに関係しています。また、SingleTouch/MultiTouchから独立しています。

どのようにしてこれらのアニメーションをタッチ非依存で作成できますか?私はsetUserInteractionEnabled呼び出しをアニメーションレスポンダに追加することを考えていました。しかしこれは正しいとは思わない?

答えて

0

setUserInteractionEnabledが正しい例です。おそらくそれはAppleによるMoveMeの例です。彼らはまたsetUserInteractionDisabledコールを使用しています。私は重要な問題は、あなたの意見がどこにあるのか、どのアニメーションがどのように動いているのか、そして何が終わるときに起こるのかを明確に理解することだと思います。それ以上のイベントを生成しないようにアニメーションをキャンセル/停止する適切な機能を知ることは有益です。

さらに、私の例では、インターフェイスに戻るボタンを追加する必要がありました。つまり、コントローラを何とかエスケープすることもできます。はい、カスタムUIのため、単純な標準UINavigationControllerではありません。

[self.backButton removeFromSuperview]; 
[self.view.superview addSubview:self.backButton]; 

をそして今、私は素敵なアニメーション&無干渉を楽しむことができます。

だから、私は self.viewのスーパーにそれをUPプッシュしていた、ボタンがまだ動作させるために。しかし、アニメーションが実際に実行されているときに、私は のままで、はバックボタンのユーザー操作を無効にする必要があります。これは、アニメーションが終了すると、その時点までに dealloc 'または削除されたメンバーにアクセスしようとするためです。私はおそらくこれを次回に呼びかけようとします:

[self.view.layer removeAllAnimations]; 
0

「animationStarted」のような変数を保持するだけで、別のアニメーションが進行中のときにアニメーションを実行することはできません。

+0

画面に触れてアニメーションが実行されているとき、実際にアニメーションが再び開始されていることを示していますか? –

+0

いいえ、アニメーションは開始されますが、最初のアニメーションがまだ終了していないうちに、2番目のアニメーションを開始しているようです。しかし、多分私は間違っています。 –

+0

私はそれをもう一度チェックしました - それは問題ではありませんでした。私は問題を発見したと思って、より多くのチェックと質問に答えます。それは干渉に関するものです。 –

関連する問題