2010-02-04 8 views
6

Pracowałem nad aplikacją Cocoa Touch i próbowałem poradzić sobie z dotknięciami, określając, która podwarsza warstwy widoku została dotknięta. Kod mojego kontrolera wyglądał następująco:Dlaczego do testowania trafień należy użyć programu presentationLayer firmy CALayer?

CALayer *hitLayer = [self.view.layer hitTest:point]; 

To nie działało. To zadziała, jeśli wystukałbym dna podwarstw, ale nie na szczytach. Po godzinie wyrywanie włosów i Googling, ale w końcu zorientowali się, że to działa, jeśli ktoś używa warstwy prezentacji, aby wykonać badanie trafienie zamiast warstwy samego:

CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point]; 

Tak, mam rozwiązać mój problem , ale moje pytanie brzmi: dlaczego?

Przeczytałem przewodnik po Core Animation i rozumiem, że drzewo prezentacji i drzewo renderowania mogą się różnić od drzewa modelu obiektowego. Ale nie rozumiem, dlaczego drzewo prezentacji miałoby (podobno) inne zachowanie podczas testowania trafień. Czy drzewo prezentacji i model obiektowy nie miałyby takich samych ramek, granic, itp.?

+0

Jaka jest klasa self.view: UIView lub CALayer? –

+0

self.view jest UIView. Poprawiłem powyższy kod, aby użyć "self.view.layer", tak jak powinno być. –

Odpowiedz

4

Zgodnie z CALayer documentation, wydaje się, że istnieje różnica między modelem i drzewem prezentacji w odniesieniu do tego, co jest prezentowane użytkownikowi (w zależności od trwającej animacji). Do testowania trafień, nie ma odniesienia w metodzie presentationLayer:

Na przykład wysyłając hitTest: wiadomość do presentationLayer będzie kwerendy wartości prezentacja drzewie warstwy.

Podejrzewam, że tylko warstwa prezentacji ma odpowiednie informacje o geometrii, aby wykonać test trafienia.

3

Kristopher, miałem bardzo podobny problem. Jednak po przekonwertowaniu tego punktu na superwarstwy lub superwidokowy układ współrzędnych zadziałał idealnie. Nie użyłem warstwy prezentacji.

//Identify the touch point in the view. Using UITapRecognizer 
CGPoint loc = [recognizer locationInView:recognizer.view]; 

//convert the point to superview co-ordinates and then identify the layer using hit test. 
CALayer *layer = [self.layer hitTest:[self convertPoint:loc toView:self.superview]]; 

Zwraca mi warstwę, która została dotknięta, przynajmniej na razie. Daj nam znać, jeśli uważasz, że to niewłaściwe podejście i zamiast tego powinienem używać warstwy prezentacji.

Powiązane problemy