Как обнаружить пересечение двух кадров изображения при анимации?

В моем UIView я создал UIImageView с именем targetView, где я установил для него серию анимаций:

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

Я также создал еще один UIImageView с именем shootView, который будет перемещаться в целевом направлении по прикосновению пальца. Его движение также реализовано в виде анимации. В конце анимации определите пересечение с 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
                             }];

Теперь есть проблема: команда пересечения работает нормально только в том случае, если targetView достиг конечной точки текущей анимации, а ShootView оказывается там. Пока targetView находится в движении где-то в середине анимации, пересечение не может быть обнаружено, даже если визуально совершенно очевидно, что два кадра пересекаются.


person ceriseche    schedule 13.04.2012    source источник


Ответы (1)


Этот подход может быть сложным, поскольку вы можете получать обратные вызовы только в начале и в конце анимации UIView. В вашем примере метод CGRectIntersectRect вызывается только после завершения анимации.

Одно из решений может состоять в том, чтобы использовать 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
}
person BinaryGuy    schedule 18.04.2012