2010-10-16 12 views
8

Estamos agregando funcionalidad de arrastrar y soltar a lo que se convertirá en un campo de deportes con posiciones para los jugadores.iOS - Arrastrar y soltar la detección de colisiones ¿Cómo detectar cuando el elemento seleccionado se arrastra sobre otra subvista?

Las posiciones se trazan utilizando el Creador de interfaces con cada una de ellas como UIImageView por separado.

Queremos ser capaces de arrastrar las imágenes de los jugadores desde las posiciones de banco desde el lateral de la pantalla a las posiciones en el campo.

¿Cuál es la mejor manera de detectar cuándo el jugador seleccionado que se está moviendo colisiona con un juego existente imageView?

Estamos buscando una manera de detectar si hay una vista o ImageView en la ubicación actual.

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    tile1.center = location; 

    if gamePositionExistsAtCurrentLocation(location) { //want something like this 
    [tile1 setBackgroundColor:[UIColor blueColor]]; 
    } else { 
    [tile1 setBackgroundColor:[UIColor yellowColor]]; 
    } 
} 

Respuesta

14

cheque si el marco del elemento que se está moviendo se cruza con la trama desde el de sus subvistas

for (UIView *anotherView in self.subviews) { 
    if (movingView == anotherView) 
     continue; 
    if (CGRectIntersectsRect(movingView.frame, anotherView.frame)) { 
     // Do something 
    } 
} 

Si yo fuera usted, me gustaría añadir todos los elementos relevantes del juego a un NSArray y para -pasar por esto Por lo tanto, no detecta colisiones con las subvistas que no tienen nada que ver con el juego, como las etiquetas, etc.

+0

Así que la idea es que cada vez que me muevo corro por una matriz de objetos y ver si coinciden con mi ubicación actual (pero usando marco en lugar como usted menciona)? – Evolve

+0

¿Hay algún método proporcionado por Apple que pueda usar para informarme qué subvistas actualmente se cruzan con un punto específico? – Evolve

4

También podría considerar view.center con CGRectContainsPoint()

+0

El método tiene el siguiente formato: CGRectContainsRect (<# CGRect rect1 #>, <#CGRect rect2 #>) ¿cómo puedo representar view.center o location.centre como rect? – Evolve

+0

No CGRectContainsRect(), estaba diciendo usar CGRectContainsPoint(). No use el primero a menos que su rectángulo de gota sea significativamente más grande porque eso solo retorna verdadero si un rectángulo está completamente dentro de otro. – Nimrod

+0

Lo siento mal ... señorita ... lea su publicación ... gracias. Lo arreglaron. Su sugerencia ha sido muy útil. – Evolve

Cuestiones relacionadas