2016-01-23 2 views
1

J'ai contrôleur où sont tombent beaucoup de photos au hasard en utilisant CAKeyframeAnimation et je devrais recadrer cette images en touchant la piste, des animations en utilisant CALayer pour présenter l'image animée, et j'essaie de détecter touchez l'événement à l'intérieur de cette couche en utilisant [layer presentationLayer]. Le problème est que - pour rogner cette image, je devrais créer des chemins à partir de mon segment de traqueur et de couche, je ne comprends pas encore comment je peux créer ces chemins mais la question est de savoir comment détecter ce point de contact en tombant CALayer système de coordonnées, image ci-joint plus informatif.Détecter un événement tactile dans le système de coordonnées de CALayer

Des idées?

Explanation pic.

Pour détection de point de contact dans la couche liée avec le contrôleur système de coordonnées J'utilise ce code:

- (void) touchesMoved:(NSSet *)touches :(CGPoint) movingPoint :(UIEvent *)event 
{ 
    NSArray *layers = [[contextView layer] sublayers]; 
    for (CALayer *layer in layers) { 
      CGRect imageRect = [[layer presentationLayer] frame]; 
      if(CGRectContainsPoint(imageRect, movingPoint)) { 
       NSLog(@"Image position - x %f y %f", movingPoint.x, movingPoint.y); 
      } 
    } 
} 

Répondre

0

Comme vous le savez probablement, le point de votre réception est dans le système de coordonnées de la vue, qui devrait généralement être identique au système de coordonnées de la couche principale de la vue. (Sinon, il y a encore des façons de le convertir, mais à moins d'avoir fait quelque chose de bizarre, il est plus facile de se fier au fait que ce sont les mêmes.)

Il est également important de savoir qu'une fois que vous avez a commencé à faire tourner quelque chose, son frame est indéfini. Si vous réfléchissez un peu à la façon dont les cadres fonctionnent, il devrait être évident que cela doit être le cas (vous ne pouvez pas définir un losange en utilisant un rectangle non-aligné).

Nous pouvons facilement convertir d'un système à l'autre en utilisant convertPoint:fromLayer:. Il n'y a pas de méthode touchesMoved:movingPoint: dans iOS, donc je suppose qu'il s'agit d'une méthode personnalisée où vous avez déjà travaillé sur le point dans votre propre système de coordonnées. Donc, vous voudriez quelque chose comme:

CGPoint pointInLayer = [[layer presentationLayer] convertPoint:movingPoint fromLayer:self.view.layer]; 
CGRect layerBounds = [[layer presentationLayer] bounds]; 
if (CGRectContainsPoint(layerBounds, pointInLayer)) { 
    // Intersect! 
} 

Les limites sont toujours définies, car ils sont toujours dans le propre système de coordonnées d'une couche. Nous convertissons donc le point dans le système de coordonnées de la couche et demandons si ce point existe dans ses limites.

+0

Oui, vous avez raison, j'ai manqué ce fait rapidement mais vous me montrez la direction. Je vous remercie! – Eugene