hitTest en CALayer: ¿cómo encuentras qué capa real fue golpeada?

Situación: es necesario encontrar qué capa ha tocado el usuario.

Problema: Apple dice que deberíamos usar [CALayer presentationLayer] para hacer testings de impacto, de modo que represente lo que en realidad está en la pantalla en ese momento (captura información a mitad de la animation, etc.).

… excepto: presentationLayer NO devuelve las capas originales, devuelve copys de ellas … así: el hitTest devolverá una nueva instancia de CALayer que no es equivalente al original.

¿Cómo encontramos qué CALayer real fue alcanzado?

p.ej

CALayer* x = [CALayer layer]; CALayer* y = [CALayer layer]; [self.view.layer addSublayer: x]; [self.view.layer addSublayer: y]; ... CALayer* touchedLayer = [self.view.layer.presentationLayer hitTest:touchPoint]; 

… ¿pero se toca Let's "x" o es "y"?

 if( touchedLayer == x ) // this won't work, because touchedLayer is - by definition from Apple - a new object 

La respuesta de Adam es correcta y me ayudó. Aquí está el código que he usado que puede ayudar a alguien más.

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint touchPoint = [(UITouch*)[touches anyObject] locationInView:self]; CALayer *touchedLayer = [self.layer.presentationLayer hitTest:touchPoint]; // is a copy of touchedLayer CALayer *actualLayer = [touchedLayer modelLayer]; // returns the actual layer NSLog (@"touchedLayer: %@", touchedLayer); NSLog (@"actualLayer: %@", actualLayer); } 

¡Ah! Simplemente descubrí esto, leyendo una publicación de la list de correo sobre un problema diferente con CALayer.

Después de llamar a [CALayer presentationLayer] y trabajar con el "clon de presentación" del tree de capas, puede tomar cualquier object en ese tree y llamar a [CALayer modelLayer] para recuperar el object de reference original en la misma position en el arbol original

Esta reference es estable (probado, funciona).

Los documentos de Apple son un poco … oscuros … en este caso. E implican que fallará "a veces" (" … los resultados no están definidos "), pero por ahora es lo suficientemente bueno para mí.