Pregunta

¿Hay problemas conocidos con reconocedores de gestos y los métodos de la clase UIView para la animación?

Estoy teniendo problemas con una secuencia de animaciones en un UIImageView de UIGestureRecognizer de devolución de llamada. Si la secuencia de animaciones se inicia desde una devolución de llamada estándar como TouchUpInside, la animación trabaja muy bien. Si se inicia a través del UILongPressGestureRecognizer, a continuación, la primera animación salta al final y la segunda animación comienza inmediatamente.

Aquí hay un ejemplo que ilustra mi problema. En el .xib para el proyecto, tengo un UIImageView que está conectado a la viewToMove IBOutlet. También tengo una UIButton conectado a la startButton IBOutlet, y me he conectado su acción TouchUpInside a la startButtonClicked IBAction. La acción TouchUpInside funciona como yo quiero que, pero el longPressGestureRecognizer salta al final de la primera animación después de aproximadamente medio segundo. Cuando NSLog la segunda animación (animateTo200) Veo que se llama dos veces cuando una pulsación larga inicia la animación pero sólo una vez cuando la acción TouchUpInside del botón se inicia la animación.

- (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];          
}
¿Fue útil?

Solución

Se debe cambiar la firma de startButtonClicked a - (void)startButtonClicked:(UIGestureRegognizer *)gestureRecognizer y luego consultar la propiedad state del reconocedor gesto en el método. El reconocedor gesto llamará a sus múltiples veces método de acción con diferentes estados (por ejemplo UIGestureRecognizerStateBegan y UIGestureRecognizerStateEnded).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top