iphone - UIButton no interactuando durante la animación
core-animation caanimation (4)
Intento animar un UIButton. Pero durante su animación, no hay interacción con UIButton. El comportamiento esperado es poder hacer clic en el botón mientras se mueve. Aquí está el fragmento de código del UIButton y la animación:
UIImage *cloudImage = [UIImage imageNamed:@"sprite.png"];
UIButton moveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[moveBtn setFrame:CGRectMake(0.0, 80.0, cloudImage.size.width, cloudImage.size.height)];
[moveBtn setImage:cloudImage forState:UIControlStateNormal];
[moveBtn addTarget:self action:@selector(hit:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:moveBtn];
CGPoint newLeftCenter = CGPointMake( 300.0f + moveBtn.frame.size.width / 2.0f, moveBtn.center.y);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:5.0f];
[UIView setAnimationRepeatCount:HUGE_VALF];
moveBtn.center = newLeftCenter;
[UIView commitAnimations];
hit
selector de hit
solo muestra un NSLog para mostrar si el botón responde o no. Cualquier ayuda sería apreciada.
Intente configurar la opción de animación en UIViewAnimationOptionAllowUserInteraction
.
[UIView animateWithDuration:.2
delay: 0
options: UIViewAnimationOptionAllowUserInteraction
animations:^{
// animation logic
}
completion:^(BOOL completed) {
// completion logic
}
];
Este problema es causado por grandes animaciones por bloque. Hice una solución basada en NSTimer, como la sugerida anteriormente, y funcionó ... sin embargo, el movimiento fue desigual (a menos que insertara una animación dentro de cada activador de evento de temporizador).
Entonces, como la animación era necesaria de todos modos, encontré una solución que no requiere temporizador. Anime solo una corta distancia y, por lo tanto, el clic del botón sigue siendo preciso, con solo un pequeño error que es mi caso es muy imperceptible en la interfaz de usuario, y puede reducirse dependiendo de tus parámetros.
Tenga en cuenta a continuación que el error en cualquier momento dado es <15.0, que puede reducirse para una mayor precisión, según los requisitos de velocidad de su animación. También puede reducir el tiempo de duración para obtener más velocidad.
- (void)conveyComplete:(UIView*)v
{
[self convey:v delay:0];
}
- (void)convey:(UIView*)v delay:(int)nDelay
{
[UIView animateWithDuration:.5
delay:nDelay
options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
animations: ^
{
CGRect rPos = v.frame;
rPos.origin.x -= 15.0;
v.frame = rPos;
}
completion: ^(BOOL finished)
{
[self conveyComplete:v];
}];
}
Otra opción es agregar un botón transparente sobre el botón que estás animando. En su caso particular, es posible que no pueda usar esto, ya que está moviendo el botón, pero es posible que pueda crear un botón de superposición lo suficientemente grande como para cubrir desde la posición inicial hasta la final.
Tuve este problema y, en mi caso, el uso de UIViewAnimationOptionAllowUserInteraction no funcionó. Estaba animando el alfa de un UIButton dentro de un UIBarButtonItem (creado con initWithCustomView :) para hacer un efecto pulsante, y esa opción no funcionaría. No me gusta la opción NSTimer tampoco (no es suave), así que al final acabo de agregar un botón de superposición, que no me gusta, pero que funciona a la perfección.
Hubo algunas preguntas aquí recientemente sobre esto. La animación es puramente visual. Puede presionar el botón en el cuadro anterior hasta que se complete la animación, cuando termina, el botón real salta.
EDITAR:
Esta respuesta es a lo que me refería. Necesitas mover manualmente el botón con un NSTimer, aparentemente. Consulte la pregunta / respuesta vinculada para obtener más información.
Otras personas sugieren pasar UIViewAnimationOptionAllowUserInteraction
como una opción de UIViewAnimation.