2011-06-14 13 views
7

Estoy tratando de 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. He aquí el fragmento de código de la UIButton y animación:UIButton no interactuando durante la animación

selector de
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 sólo muestra una NSLog para mostrar si el botón de responder a ella o no. Cualquier ayuda sería apreciada.

Respuesta

8

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.

EDIT:

This answer es 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 UIViewAnimation.

+0

básicamente mi animación va de izquierda a derecha, no puedo esperar hasta que termine la animación. esto frustrará el propósito de tener un botón allí en primer lugar, ya que es solo para poder tocarlo durante su movimiento. – Frank

+0

Consulte mis ediciones. – Moshe

+0

ah genial thx, agregué un touchBegan y detecté el rect que está siendo tocado, esto está funcionando para mí, aunque hubiera sido genial si se pudiera hacer clic en el botón durante la diapositiva de animación :( – Frank

24

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 
       } 
]; 
+1

intentó que todavía no funciona – Frank

+0

+ 1 Funcionó para mí. –

+1

Funcionó muy bien. Tenía un UIButton que pulsaba animando el backgroundColor. Agregar esta opción resolvió mi problema. Gracias. – TMilligan

0

Este problema está 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).

Por lo tanto, como se requería animación 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 que el error en cualquier momento dado es < 15.0, que se puede reducir para obtener 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]; 
        }]; 

} 
+0

Por cierto, la vista que se está moviendo contiene UIButtons en los que se puede hacer clic. – paiego

0

Otra opción es agregar un botón transparente sobre el botón que está 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.

Cuestiones relacionadas