2011-12-18 11 views

risposta

20

Concettualmente, una vista "tocca" un'altra vista se i loro riquadri di delimitazione si intersecano. Quindi, per confrontare i rettangoli di delimitazione di due punti di vista, si vuole fare qualcosa di simile:

Boolean viewsOverlap = CGRectIntersectsRect(viewA.bounds, viewB.bounds); 

Ma questo da solo non funzionerà perché i rettangoli di delimitazione delle viste sono specificate nei propri spazi di coordinate (che significa sia partono da 0,0, ecc ecc) Quindi è necessario anche di trasformare i rettangoli di uno spazio di coordinate comune prima del confronto:

CGRect boundsA = [viewA convertRect:viewA.bounds toView:nil]; 
CGRect boundsB = [viewB convertRect:viewB.bounds toView:nil]; 
Boolean viewsOverlap = CGRectIntersectsRect(boundsA, boundsB); 

da lì, si dovrebbe essere in grado di capire come iterare in modo efficiente attraverso la vostra lista di osserva-si-cura-su per determinare se si sovrappongono.

+1

+1 ben spiegato – Till

4

In alternativa si può solo confrontare le cornici se sono nella stessa superview:

BOOL methodB = CGRectIntersectsRect(viewA.frame, viewB.frame); 
+0

Questo funziona perfettamente! – Bobby

Problemi correlati