2010-02-04 5 views
6

Ich habe an einer Cocoa Touch-Anwendung gearbeitet und versucht, Berührungen zu behandeln, indem ich festgestellt habe, welche Teilschicht der Ebene einer Ansicht berührt wurde. Der Code meines Controllers sah so aus:Warum muss man CALayers presentationLayer für Hit-Tests verwenden?

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

Dies funktionierte nicht. Es würde funktionieren, wenn ich auf die Unterseiten von Unterschichten tippte, aber nicht auf die Oberseiten. Nach einer Stunde Haareziehen und googeln, ich heraus, schließlich dachte, dass es funktioniert, wenn man die Präsentationsschicht verwendet die Hit-Prüfung statt der Schicht selbst zu tun:

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

So habe ich mein Problem gelöst , aber meine Frage ist: Warum?

Ich habe den Leitfaden zur Kernanimation gelesen, und ich verstehe, dass der Darstellungsbaum und der Darstellungsbaum vom Objektmodellbaum abweichen können. Aber ich verstehe nicht, warum der Darstellungsbaum (scheinbar) ein anderes Hit-Test-Verhalten hat. Wären der Präsentationsbaum und das Objektmodell nicht dieselben Rahmen, Grenzen usw.?

+0

Was ist die Klasse von self.view: UIView oder CALayer? –

+0

self.view ist eine UIView. Ich habe den obigen Code korrigiert, um "self.view.layer" zu verwenden, wie es hätte sein sollen. –

Antwort

4

Laut der CALayer documentation scheint es einen Unterschied zwischen dem Modell und dem Darstellungsbaum hinsichtlich dessen zu geben, was dem Benutzer präsentiert wird (abhängig von der laufenden Animation). Für Treffertests gibt es eine Referenz im presentationLayer Methode:

Um zum Beispiel eine hitTest Senden: Nachricht an das presentationLayer wird Abfrage, um die Präsentation der Werte Schicht Baum.

Also ich vermute, dass nur Präsentationsschicht die richtigen Geometrieinformationen hat, um den Treffertest durchzuführen.

3

Kristopher, ich hatte ein sehr ähnliches Problem. Als ich jedoch den Punkt in das Superlayer-Koordinatensystem umgewandelt habe, funktionierte es perfekt. Ich habe die Präsentationsebene nicht verwendet.

//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]]; 

Das gibt mir die Ebene, die berührt wurde, zumindest für jetzt. Lassen Sie uns wissen, wenn Sie denken, dass dies eine falsche Herangehensweise ist, und ich stattdessen Präsentationsebene verwenden sollte.

Verwandte Themen