1

私の UIView では、一連のアニメーションに設定した targetView というUIImageViewを作成しました。

[UIView animateWithDuration:1.0
                 animations:^{self.targetView.center = CGPointMake(220,20);}
                 completion:^(BOOL finished){
                                             //another animation will begin;
                                            }];

また、指でスワイプするとターゲット方向に移動する、shootViewという別の UIImageView も作成しました。その動きもアニメーションで実装。アニメーションの最後で、targetView との交差を検出します。

[UIView animateWithDuration:1.0
                 animations:^{
                 self.shootView.center = CGPointMake(destX, destY);}
                 completion:^(BOOL finished){
                            if (CGRectIntersectsRect(self.targetView.frame, self.shootView.frame)) {
                            //do something
                             }];

ここで問題があります。intersect コマンドは、targetView が現在のアニメーションの終点に到達し、shootView がたまたまそこにある場合にのみ正常に機能します。targetView がアニメーションの途中で移動している間、2 つのフレームが交差していることが視覚的に非常に明白であっても、交差を検出することはできません。

4

1 に答える 1

1

UIView アニメーションの開始時と終了時にしかコールバックを取得できないため、このアプローチは扱いにくい場合があります。あなたの例では、CGRectIntersectRect メソッドは、アニメーションが完了した後にのみ呼び出されています。

1 つの解決策は、NSTimer を使用してシュートビューの位置をアニメーション化し、位置が変化するたびに衝突検出を行うことです。すなわち

[NSTimer timerWithTimeInterval: 0.03 target: self selector: @selector(timerTicked:) userInfo: nil repeats: YES];

-(void) timerTicked: (NSTimer*) timer {

  // do move
  // check for colisions
  // optional invalidation of timer
}
于 2012-04-18T15:31:54.620 に答える