2012-12-20 17 views
8

Ich habe ein Problem mit der Erkennung von Schnittpunkten meiner UIView Objekte.Schnitt von zwei UIView-Objekten in verschiedenen Superansichten erkennen

Das ist, was ich habe unten verwendet:

Für Kreuzung zwei Objekte, das ich brauche, um herauszufinden, wie man übersetzen Koordinatensystem von dem ersten Superview zu einem anderen Koordinatensystem.

Ich habe diesen Ansatz verwendet: - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view hier beschrieben link.

Wie ich weiß, ist es sehr einfach, diese Methode zu verwenden. Aber in den verschiedenen Fällen ist es schwer aufgrund einer kleinen Beschreibung in der Dokumentation (aber vielleicht nur für mich).

Dies ist meine Struktur der Teilansichten, die auf dem Bild unten gezeigt wird. Ich habe bereits alle Methoden zum Ziehen und Ablegen von Objekten. Aber ich muss herausfinden, wie man Kreuzung für UIViewA und UIViewB bekommen kann. Danke für die Hilfe.

enter image description here

+0

Könnten Sie bitte die Hierarchie beschreiben ausführlicher? Enthält eine einzelne Superansicht beide Ansichten A und B? –

+0

+1 für die Perspektive Skew auf Ihrer Abbildung – Till

+0

danke für die Antwort Jungs. also über Superview - es gibt zwei verschiedene Superviews für A- und B-Views. Wenn ich die B-Ansicht verschiebe, ändern sich die Koordinaten nur für Superview, wo B-View platziert wird. Also, um B-Koordinaten in Koordinaten zu übersetzen, wo eine Ansicht platziert wird, muss ich eine der vielen convertRect-Methoden verwenden, die in der UIView-Klasse deklarieren, danach muss ich eine Schnittmenge mit konvertierten Koordinaten und A view rect bekommen. Sehr einfach zu verstehen, aber nicht sehr einfach, um dieses Zeug zu machen) –

Antwort

5

Ich habe diese Lösung implementiert:

- (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

Schauen Sie sich die Funktionen 'CGRectGetMidX' und' CGRectGetMidY' in ['CGGeometry'] an (https://developer.apple.com/library/mac/#documentation/ graphicsimaging/Referenz/CGGeometry/Reference/reference.html). –

+0

Wenn Sie wirklich nach Schnittpunkten testen möchten, ist es nicht ausreichend, das ** Zentrum ** eines Rechtecks ​​zu testen. – Nate

+0

Ja, Sie haben Recht. Es ist keine ausreichende Lösung für alle Ansätze. Ich benutze die Mittelpunkte meines Objekts, weil ich viele Objekte (Ansichten) habe, die nebeneinander liegen. Wenn ich also die B-Ansicht in eine andere Ansicht ziehe, muss ich sie mit einer Ansicht überschneiden, in der sich die Mittelpunkte des B-Objekts befinden. Wenn wir also annehmen, dass wir unter A eine andere C-Ansicht haben, muss ich die Schnittmenge nur für eine dieser Ansichten (A und C) erkennen. In diesem Fall verwende ich einen Mittelpunkt, der nur eine der Ansichten schneidet, wenn ich sie verwende rect of B view, das zwei von ihnen schneiden kann. –

0

Ich denke, das auf den Code in Ihrer Antwort entspricht, aber deutlich kürzer:

- (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

Ich weiß, dass die Antwort des Posters dasselbe tut, aber im Allgemeinen ist das Testen des Zentrums eines Rechtecks ​​in einem anderen kein gültiger Schnitttest. – Nate

Verwandte Themen