Question

Y at-il des problèmes connus avec geste de reconnaissance et les méthodes de la classe UIView pour l'animation?

Je rencontre des problèmes avec une séquence d'animations sur un UIImageView de rappel UIGestureRecognizer. Si la séquence d'animations est démarré à partir d'un rappel standard comme TouchUpInside, l'animation fonctionne très bien. Si elle est lancée par le 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é à la viewToMove IBOutlet. J'ai aussi un UIButton connecté au startButton IBOutlet, et je l'ai connecté son action TouchUpInside au startButtonClicked IBAction. L'action TouchUpInside fonctionne comme je le veux, mais la longPressGestureRecognizer passe à la fin de la première animation au bout d'environ une demi-seconde. Quand je NSLog la deuxième animation (animateTo200) Je peux voir qu'il est appelé deux fois lorsqu'une pression longue commence l'animation, mais une seule fois lorsque l'action TouchUpInside démarre l'animation du bouton.

- (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];          
}
Était-ce utile?

La solution

Vous devez modifier la signature de startButtonClicked à - (void)startButtonClicked:(UIGestureRegognizer *)gestureRecognizer puis interroger le geste de propriété state de la méthode de reconnaissance. Dispositif de reconnaissance de geste appeler sa méthode d'action plusieurs fois avec différents états (par exemple UIGestureRecognizerStateBegan et UIGestureRecognizerStateEnded).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top