2010-04-04 14 views
2

J'ai un UIView qui contient un certain nombre de sous-classes CALayer. J'utilise le code suivant pour détecter quelle couche d'un événement tactile correspond à:iPhone hitTest interrompu après la rotation

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 
NSLog(@"%@,%@",NSStringFromCGPoint(point),[self.layer hitTest:point].name); 


} 

Cela fonctionne bien jusqu'à ce que le dispositif est mis en rotation. Lorsque le périphérique est pivoté, toutes les couches actuelles sont supprimées de la super-couche et de nouveaux calayers sont créés pour s'adapter à la nouvelle orientation. Les nouvelles couches sont correctement insérées et visibles dans la bonne orientation.

Après la rotation, la méthode hitTest renvoie systématiquement la valeur null pour la couche. J'ai remarqué que lorsqu'on la fait pivoter de 180 degrés, la couche retournée est ce qui était à cet endroit avant la rotation, c'est-à-dire qu'elle touche la couche supérieure gauche et donne la couche en bas à droite lorsqu'elle est tournée de 180 degrés. Les coordonnées du test d'impact sont imprimées comme prévu avec (0,0) étant en haut à gauche. Je redessine les calques à chaque rotation, mais pour une raison quelconque, ils semblent correspondre à la "bonne" méthode, avec le bouton d'accueil en bas. Ai-je manqué un appel de fonction ou quelque chose après avoir manipulé la rotation?

Cheers, Adam

Répondre

4

D'accord, j'ai trouvé que le code suivant fonctionne dans toutes les orientations sans aucun problème (Dans mon cas, il n'y a pas vues qui se chevauchent si cela est approprié pour moi):

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *t = [touches anyObject]; 

    CGPoint point = [t locationInView:self]; 

    for(CALayer *layer in self.layer.sublayers) { 

     CGPoint convertedPoint = [self.layer convertPoint:point 
                toLayer:layer]; 

     if([layer containsPoint:convertedPointPoint]) { 
      NSLog(@"%@",layer.name); 
     } 
    } 
} 

Bien que cette conversion de point manuelle fonctionne correctement, la question reste posée de savoir pourquoi l'appel de méthode d'origine n'a pas fonctionné. Quelqu'un peut-il m'éclairer?

Adam