2009-02-21 5 views
21

Ich bin neu im iPhone SDK. Im Moment programmiere ich mit CALayers, was ich sehr mag - nicht so teuer wie UIViews und viel weniger Code als OpenGL ES Sprites.Wie bekomme ich Berührungsereignisse auf einem CALayer?

Ich habe diese Frage: ist es möglich, ein Touch-Ereignis auf einem CALayer zu bekommen? Ich verstehe, wie auf einem UIView mit

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

ein Berührungsereignis zu bekommen, aber ich kann nicht überall über, wie man ein Berührungsereignis auf einem CALayer Objekt, zum Beispiel ein orangefarbenes Quadrat schwebt im 3D-Raum finden. Ich weigere mich zu glauben, dass ich der Einzige bin, der neugierig darauf ist.

Ich freue mich über jede Hilfe!

Antwort

29

ok- beantwortete meine eigene Frage! Nehmen wir an, Sie haben eine Menge CALayers in der Hauptschicht Ihres View-Controllers und möchten, dass sie auf Opazität 0,5 gehen, wenn Sie sie berühren. diesen Code in der .m-Datei Ihrer View-Controller-Klasse implementieren:

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

Hinweise für Klarheit: 1. Die for-Schleife ist ein wenig umständlich, da man dort überprüft nur einem Tastendruck. Die übliche Vorgehensweise besteht darin, mit [touch anyObject] oder [touch objectAtIndex: 0] einen Zeiger auf eine Berührung zu setzen. 2. Anstatt convertPoint: zu verwenden, übergeben Sie einfach "nil" an locationInView: an erster Stelle. Dies gibt den Berührungsort im Koordinatensystem des Fensters an, sodass die nächste Zeile überflüssig ist. – Rab

+1

Ich weiß, das ist ziemlich alte Fragen. Aber nur für diejenigen, die neugierig sind. @Rab Größtenteils rechts außer [berührt objectAtIndex: 0] NSset, das eine Reihe von Berührungen darstellt, hat keinen objectAtIndex-Selektor. –

+0

+1 Guter Punkt @EugeneProkoshev. Es ist möglich, dass jemand Berührungsereignisse in ein NSArray einfügt, aber in diesem Fall haben wir nur das NSSet, das nicht indiziert ist. Danke für die Klärung einer Klärung. :) – Rab

1

fand ich, dass ich mit

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

musste ich ändern Sie ihn auf

point = [[touch view] convertPoint:point toView:self.view]; 
die falschen Koordinaten wurde immer

Um die richtige Schicht zu erhalten

+0

Vielen Dank ..... !! – Sarah

7

Ähnlich wie die erste Antwort.

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