2009-02-21 13 views
21

Soy nuevo en el iPhone SDK. En este momento estoy programando con CALayers que realmente me gustan mucho, no tan caros como UIViews y mucho menos código que los sprites de OpenGL ES.¿Cómo se obtiene el evento táctil en un CALayer?

Tengo esta pregunta: ¿es posible obtener un evento táctil en un CALayer? entiendo cómo conseguir un evento táctil en una UIView con

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

pero no puedo encontrar en cualquier lugar de cómo conseguir un evento de toque en un objeto CALayer, por ejemplo, un cuadrado naranja flotando en el espacio 3D. Me niego a creer que soy el único que siente curiosidad por esto.

¡Agradezco cualquier ayuda!

Respuesta

29

ok- respondió mi propia pregunta! digamos que tienes un montón de CALayers en la capa principal de tu controlador de vista, y quieres que vayan a la opacidad 0.5 cuando los tocas. implementar este código en el archivo .m de la vista de clase controlador:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([touches count] == 1) { 
     for (UITouch *touch in touches) { 
      CGPoint point = [touch locationInView:[touch view]]; 
      point = [[touch view] convertPoint:point toView:nil]; 

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

      layer = layer.modelLayer; 
      layer.opacity = 0.5; 
     } 
    } 
} 
+1

Notas para mayor claridad: 1. El bucle for es un poco incómodo, ya que se verificó que sólo hay un toque. La forma habitual de hacerlo es hacer un puntero a un toque usando [toques anyObject] o [toca objectAtIndex: 0]. 2. En lugar de usar convertPoint: simplemente pase "nil" a locationInView: en primer lugar. Eso le da a la ubicación táctil en el sistema de coordenadas de la ventana, por lo que la siguiente línea es redundante. – Rab

+1

Sé que esto es bastante viejo preguntas. Pero solo para aquellos que tienen curiosidad. @Rab Principalmente a la derecha excepto [toca objectAtIndex: 0] NSset que representa el conjunto de toques no tiene el selector objectAtIndex. –

+0

+1 Buen punto @EugeneProkoshev. Es posible que alguien coloque eventos táctiles en un NSArray, pero en este caso solo tenemos el NSSet que no está indexado. Gracias por la aclaración de una aclaración. :) – Rab

1

me di cuenta que estaba recibiendo las coordenadas equivocadas con

point = [[touch view] convertPoint:point toView:nil]; 

tuve que cambiarlo a

point = [[touch view] convertPoint:point toView:self.view]; 

Para obtener la capa correcta

+0

Muchas gracias ..... !! – Sarah

7

Similar a la primera Respuesta.

- (CALayer *)layerForTouch:(UITouch *)touch { 
    UIView *view = self.view; 

    CGPoint location = [touch locationInView:view]; 
    location = [view convertPoint:location toView:nil]; 

    CALayer *hitPresentationLayer = [view.layer.presentationLayer hitTest:location]; 
    if (hitPresentationLayer) { 
     return hitPresentationLayer.modelLayer; 
    } 

    return nil; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CALayer *hitLayer = [self layerForTouch:touch]; 

    // do layer processing... 
} 
Cuestiones relacionadas