2009-02-21 14 views
21

Jestem nowy na iPhone SDK. Teraz programuję z CALayers, które bardzo lubię - nie tak drogie jak UIViews, i dużo mniej kodu niż sprite'y OpenGL ES.Jak uzyskać zdarzenie dotykowe na CALayerze?

Mam to pytanie: Czy można uzyskać zdarzenie dotykowe na CALayerze? rozumiem, jak uzyskać dotykowy zdarzenia na UIView z

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

ale nie mogę znaleźć nigdzie o tym, jak uzyskać dotykowy zdarzenia na obiekcie CALayer, na przykład, pomarańczowy kwadrat pływające w przestrzeni 3D. Nie chcę uwierzyć, że jestem jedyną osobą, która jest tym ciekawa.

Doceniam każdą pomoc!

Odpowiedz

29

ok- odpowiedziałem na moje własne pytanie! załóżmy, że masz masę CALayerów w głównej warstwie kontrolera widoku i chcesz, aby po przejściu dotykały 0.5. wdrożyć ten kod w pliku .m swojej klasie kontrolera widoku:

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

Uwagi dla przejrzystości: 1. Pętla for jest nieco niezręczna, ponieważ zweryfikowano, że istnieje tylko jeden dotyk. Zwykle robi się to za pomocą wskaźnika [dotyka anyObject] lub [dotyka obiektu ObjectAtIndex: 0]. 2. Zamiast używać convertPoint:, po prostu prześlij "zero" do locationInView: w pierwszej kolejności. Daje to lokalizację dotyku w układzie współrzędnych okna, więc kolejna linia jest zbędna. – Rab

+1

Wiem, że to dość stare pytanie. Ale tylko dla tych, którzy ciekawi. @Rab Zasadnie z prawej z wyjątkiem [dotyka obiektu ObjectAtIndex: 0] Zestaw NSset będący reprezentacją zestawu dotknięć nie ma selektora objectAtIndex. –

+0

+1 Dobry punkt @EugeneProkoshev. Możliwe, że ktoś może umieścić zdarzenia dotykowe w NSArray, ale w tym przypadku po prostu mamy NSSet, który jest nieindeksowany. Dziękuję za wyjaśnienie. :) – Rab

1

Okazało się, że byłem coraz błędne współrzędne z

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

musiałem go zmienić na

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

Aby uzyskać poprawną warstwę

+0

Dziękuję bardzo ..... !! – Sarah

7

Podobna do pierwszej odpowiedzi.

- (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... 
} 
Powiązane problemy