2009-02-21 9 views
21

Sono nuovo per l'SDK di iPhone. In questo momento sto programmando con i CALayer che mi piacciono molto, non costosi come quelli delle UIViews e molto meno codice degli sprites OpenGL ES.Come ottenere un evento di tocco su un CALayer?

Ho questa domanda: è possibile ottenere un evento di tocco su un CALayer? capisco come ottenere un evento di tocco su un UIView con

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

ma non riesco a trovare da nessuna parte su come ottenere un evento di tocco su un oggetto CALayer, per esempio, un quadrato arancione che galleggia nello spazio 3D. Mi rifiuto di credere di essere l'unico a essere curioso di questo.

Apprezzo qualsiasi aiuto!

risposta

29

ok- ha risposto alla mia stessa domanda! diciamo che hai un sacco di CALayer nel livello principale del tuo controller di visualizzazione e vuoi che diventino opacità 0.5 quando li tocchi. implementare questo codice nel file .m della visualizzazione classe controller:

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

Note per chiarezza: 1. Il ciclo for è un po 'imbarazzante, dal momento che non v'è verificato un solo tocco. Il solito modo per farlo è quello di creare un puntatore a un tocco usando [tocca anyObject] o [tocca oggettoAtIndex: 0]. 2. Invece di usare convertPoint: basta passare "nil" a locationInView: in primo luogo. Ciò fornisce la posizione tattile nel sistema di coordinate della finestra, quindi la riga successiva è ridondante. – Rab

+1

So che questa è una domanda abbastanza vecchia. Ma solo per quelli che sono curiosi. @Rab Principalmente a destra tranne [tocca oggettoAtIndex: 0] NSset che rappresenta un set di tocchi non ha selettore objectAtIndex. –

+0

+1 Punto buono @EugeneProkoshev. È possibile che qualcuno possa inserire eventi di tocco in un NSArray, ma in questo caso abbiamo solo l'NSSet che non è indicativo. Grazie per il chiarimento di un chiarimento. :) – Rab

1

ho scoperto che mi è stato sempre le coordinate sbagliate con

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

ho dovuto cambiare a

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

Per ottenere il livello corretto

+0

Grazie mille ..... !! – Sarah

7

Simile alla prima risposta.

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