2012-12-20 12 views
8

Mam problem z wykryciem przecięcia obiektów UIView.Wykrywanie przecięcia dwóch obiektów UIView przy innym widoku podglądu

To co Użyłem poniżej:

Na skrzyżowaniu dwóch przedmiot muszę dowiedzieć się, jak przetłumaczyć jednego układu współrzędnych od pierwszego SuperView do innego układu współrzędnych.

Użyłem tego podejścia: - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view opisane tutaj link.

Jak wiem, bardzo łatwo jest użyć tej metody. Ale w różnych przypadkach jest to trudne ze względu na mały opis w dokumentacji (ale może tylko dla mnie).

To jest moja struktura subviews, która jest pokazana na obrazku poniżej. Mam już wszystkie metody dla obiektu typu "przeciągnij i upuść". Ale muszę wymyślić, jak uzyskać przecięcie dla A i B . Dzięki za pomoc.

enter image description here

+0

mógłbyś opisać hierarchię bardziej szczegółowo? Czy pojedynczy widok superwizyjny zawiera oba widoki A i B? –

+0

+1 za pochylenie perspektywy na ilustracji – Till

+0

dzięki za odpowiedzi. więc o superviewie - istnieją dwa różne suporty do widoków A i B. Kiedy przeciągam widok B, współrzędne zmieniają się tylko w powiązaniu z podglądem, w którym jest umieszczony widok B. Aby przetłumaczyć współrzędne B na współrzędne, w których jest umieszczony widok A, potrzebuję użyć jednej z wielu deklarujących metodę convertRect w klasie UIView, po tym muszę uzyskać przecięcie z przekonwertowanymi współrzędnymi i widokiem A rect. Bardzo proste do zrozumienia, ale niezbyt łatwe do zrobienia tego) –

Odpowiedz

5

I wprowadziły to rozwiązanie:

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

Sprawdź funkcje 'CGRectGetMidX' i' CGRectGetMidY' w ['CGGeometry'] (https://developer.apple.com/library/mac/#documentation/ grafikaimaging/reference/CGGeometry/Reference/reference.html). –

+0

Jeśli naprawdę chcesz przetestować na skrzyżowaniu, nie wystarczy przetestować ** centrum ** jednego prostokąta. – Nate

+0

Tak, masz rację. To nie wystarczające rozwiązanie dla wszystkich podejść. Używam punktów środkowych mojego obiektu, ponieważ mam wiele obiektów (widoków), które znajdują się obok siebie. Więc jeśli przeciągam widok B do innego widoku, muszę przeciąć go z widokiem, w którym znajdują się punkty środkowe obiektu B. Więc jeśli założymy, że w widoku A mamy również inny widok C i potrzebuję wykryć przecięcie tylko dla jednego z tych widoków (A i C), więc w tym przypadku używam punktu środkowego, który zamiast tego będzie przecinał tylko jeden widok, jeśli użyję rect widoku B, który może przeciąć dwa z nich. –

0

myślę, że to jest odpowiednikiem kodu w swojej odpowiedzi, ale znacznie krócej:

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

Wiem, że odpowiedź na plakat robi to samo, ale na ogół testowanie jednego centrum prostokąta w innym nie jest prawidłowym testem na przecięcie. – Nate

Powiązane problemy