0

Y a-t-il des problèmes connus avec les reconnaisseurs de gestes et les méthodes de classe UIView pour l'animation?iPhone SDK 3.2 UIGestureRecognizer interférant avec les animations UIView?

Je rencontre des problèmes avec une séquence d'animations sur un rappel UIImageView de UIGestureRecognizer. Si la séquence d'animations est démarrée à partir d'un rappel standard comme TouchUpInside, l'animation fonctionne correctement. Si elle est démarrée via UILongPressGestureRecognizer, la première animation saute à la fin et la deuxième animation commence immédiatement.

Voici un exemple qui illustre mon problème. Dans le .xib pour le projet, j'ai un UIImageView qui est connecté à l'IBOutlet viewToMove. J'ai aussi un UIButton connecté à l'IBOutlet startButton, et j'ai connecté son action TouchUpInside à l'IBAction startButtonClicked. L'action TouchUpInside fonctionne comme je le veux, mais le longPressGestureRecognizer passe à la fin de la première animation après environ une demi-seconde. Quand je NSLog la deuxième animation (animateTo200) je peux voir qu'il est appelé deux fois quand un appui long commence l'animation mais seulement une fois quand l'action de TouchUpInside du bouton commence l'animation.

- (void)viewDidLoad { 
[super viewDidLoad]; 

UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(startButtonClicked)]; 
NSArray *recognizerArray = [[NSArray alloc] initWithObjects:longPressRecognizer, nil]; 
[startButton setGestureRecognizers:recognizerArray]; 

[longPressRecognizer release]; 
[recognizerArray release]; 
} 

-(IBAction)startButtonClicked { 

if (viewToMove.center.x < 150) { 
    [self animateTo200:@"Right to left" finished:nil context:nil]; 
} else { 
    [self animateTo100:@"Right to left" finished:nil context:nil]; 
} 
} 

-(void)animateTo100:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
[UIView beginAnimations:@"Right to left" context:nil]; 
[UIView setAnimationDuration:4]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animateTo200:finished:context:)]; 
viewToMove.center = CGPointMake(100.0, 100.0); 
[UIView commitAnimations];   
} 

-(void)animateTo200:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
[UIView beginAnimations:@"Left to right" context:nil]; 
[UIView setAnimationDuration:4]; 
viewToMove.center = CGPointMake(200.0, 200.0); 
[UIView commitAnimations];   
} 

Répondre

4

Vous devez changer la signature de startButtonClicked à - (void)startButtonClicked:(UIGestureRegognizer *)gestureRecognizer puis interroger la propriété du geste de reconnaissance state dans la méthode. Le dispositif de reconnaissance de gestes appellera sa méthode d'action plusieurs fois avec différents états (par exemple UIGestureRecognizerStateBegan et UIGestureRecognizerStateEnded).

+2

Remarque: Veillez également à modifier l'action: '@selector (startButtonClicked:)'. Le colon est nécessaire alors. – bddckr

+0

Merci à tous les deux. Cela a résolu mon problème. Besoin de lire les documents de plus près la prochaine fois. –