2010-11-13 3 views
3

Alors j'ai regardé partout et je n'ai pas encore trouvé ce que je cherchais.Déclenche une action quand un CALayer est touché?

J'ai une vue, puis une sous-vue de cette vue. Sur cette deuxième vue, je crée CALayers en fonction des coordonnées que je lui donne. Je veux pouvoir toucher n'importe lequel de ces CALayers et déclencher quelque chose.

J'ai trouvé différents morceaux de code qui semblent pouvoir aider, mais je n'ai pas été capable de les implémenter.

Par exemple:

-(void)touchesEnded:(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; 

} } } 

et aussi ce ....

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 

    // If the touch was in the placardView, bounce it back to the center 
    if ([touch view] == placardView) { 
     // Disable user interaction so subsequent touches don't interfere with animation 
     self.userInteractionEnabled = NO; 
     [self animatePlacardViewToCenter]; 
     return; 
    }  
} 

Je suis toujours à peu près un débutant à ce genre de choses. Je me demandais si quelqu'un pouvait me dire comment faire ça. Merci pour toute aide.

Répondre

13

CALayer ne peut pas réagir directement aux événements tactiles, mais de nombreux autres objets de votre programme peuvent, par exemple, l'UIView hébergeant les couches.

Des événements, tels qu'un événement généré par le système lorsque l'écran est touché, sont envoyés via une "chaîne répondeur". Ainsi, lorsque l'écran est touché, un message est envoyé (en d'autres termes - la méthode est appelée) à l'UIView qui se trouve à l'emplacement du toucher. Pour les touches, il y a trois messages possibles: touchesBegan:withEvent:, touchesMoved:withEvent: et touchesEnded:withEvent:.

Si cette vue n'implémente pas la méthode, le système essaiera de l'envoyer à la vue parente (superview en langage iOS). Il essaie de l'envoyer jusqu'à ce qu'il atteigne la vue de dessus. Si aucune des vues n'implémente la méthode, elle essaie d'être transmise au contrôleur de vue en cours, puis au contrôleur parent, puis à l'objet application. Cela signifie que vous pouvez réagir aux événements tactiles en implémentant les méthodes mentionnées dans l'un de ces objets. Habituellement, la vue d'hébergement ou le contrôleur de vue actuel sont les meilleurs candidats.

Supposons que vous l'implémentiez dans la vue. La tâche suivante consiste à déterminer laquelle de vos couches a été touchée, pour cela, vous pouvez utiliser la méthode pratique convertPoint:toLayer:.

Par exemple est ici, il pourrait ressembler à un contrôleur de vue:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    CGPoint p = [(UITouch*)[touches anyObject] locationInView:self.worldView]; 
    for (CALayer *layer in self.worldView.layer.sublayers) { 
     if ([layer containsPoint:[self.worldView.layer convertPoint:p toLayer:layer]]) { 
      // do something 
     } 
    } 
} 
+0

pour cette ligne: [self.secondView.layer convertPoint: p toLayer: pointLayer] Je reçois une erreur qui dit: « Type Incompatible pour l'argument 1 de 'containsPoint' –

+0

Vous devez vous assurer que vous passez un CGPoint à containsPoint: Utilisez une variable locale intermédiaire si vous n'êtes pas sûr. –

Questions connexes