2012-12-20 10 views
8

Ho riscontrato un problema con il rilevamento dell'intersezione dei miei oggetti UIView.Rilevamento dell'intersezione di due oggetti UIView su diverse superview

Questo è quello che usato qui di seguito:

Per intersezione due oggetti devo capire come tradurre un sistema di coordinate dalla prima superview ad un altro sistema di coordinate.

Ho utilizzato questo approccio: - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view descritto qui link.

Come so che è molto semplice utilizzare questo metodo. Ma nei diversi casi è difficile a causa di una piccola descrizione nella documentazione (ma forse solo per me).

Questa è la mia struttura di sottoview che viene mostrata sull'immagine qui sotto. Ho già trovato tutti i metodi per trascinare e rilasciare l'oggetto. Ma ho bisogno di capire come ottenere l'intersezione per UIViewA e UIViewB. Grazie per l'aiuto.

enter image description here

+0

Potrebbe descrivere la gerarchia più in dettaglio? Una singola superview contiene entrambe le viste A e B? –

+0

+1 per l'inclinazione della prospettiva sulla tua illustrazione – Till

+0

grazie per la risposta ragazzi. quindi su superview - ci sono due diverse interviste per le visualizzazioni A e B. Quando trascino B view, le coordinate cambiano solo in relazione a superview in cui viene posizionata la vista B. Quindi, per tradurre le coordinate B in coordinate dove è posizionata una vista, ho bisogno di usare uno dei molti metodi convertRect che dichiarano nella classe UIView, dopo di che ho bisogno di ottenere l'intersezione con le coordinate convertite e una vista rect. Molto semplice da capire, ma non molto semplice per creare questa roba) –

risposta

5

ho implementato questa soluzione:

- (void)putComponent:(NSNotification *)notif { 
    // Catch B UIView. 
    UIView *view = [notif object]; 
    // Convertation. [self superview] - is view wher A UIView is placed. 
    CGRect convertedRect = [[self superview] convertRect:view.frame fromView:[view superview]]; 
    // Find center point. 
    CGPoint point; 
    point.x = convertedRect.origin.x + (convertedRect.size.width/2.0f); 
    point.y = convertedRect.origin.y + (convertedRect.size.height/2.0f); 
    // Find if CGRect (self.frame) contains a point (center of B UIView) 
    BOOL contains = CGRectContainsPoint(self.frame, point); 
    if (contains) { 
     NSLog(@"intersect here"); 
    } 
} 
+1

Controlla le funzioni 'CGRectGetMidX' e' CGRectGetMidY' in ['CGGeometry'] (https://developer.apple.com/library/mac/#documentation/ graphicsimaging/riferimento/CGGeometry/Reference/reference.html). –

+0

Se si desidera testare realmente l'intersezione, non è sufficiente testare il ** centro ** di un rettangolo. – Nate

+0

Sì, hai ragione. Non è una soluzione sufficiente per tutti gli approcci. Utilizzo i punti centrali del mio oggetto perché ho molti oggetti (viste) che si trovano uno accanto all'altro. Quindi, se trascino la vista B su un'altra vista, devo intersecarla con una vista in cui si trovano i punti centrali dell'oggetto B. Quindi se supponiamo che sotto la vista A abbiamo anche un'altra vista C e ho bisogno di rilevare l'intersezione solo per una di queste viste (A e C), quindi in questo caso uso il punto centrale che intersecherà solo una delle viste se invece uso rect of B view che può intersecare due di essi. –

0

Credo che questo sia equivalente al codice nella sua risposta, ma notevolmente più breve:

- (void)putComponent:(NSNotification *)note { 
    UIView *other = note.object; 
    CGPoint otherCenterInMe = [self convertPoint:other.center fromView:other.superview]; 
    if ([self pointInside:otherCenterInMe withEvent:nil]) { 
     NSLog(@"intersect here"); 
    } 
} 
+0

So che la risposta del poster fa la stessa cosa, ma in generale, il test per il centro di un rettangolo in un altro non è un test di intersezione valido. – Nate

Problemi correlati