2011-07-20 14 views
5

En mi método viewDidLoad, coloco un botón a la izquierda de la vista, fuera de la pantalla.setFrame en UIView la animación no se mueve, solo se coloca en su lugar

Luego uso de estos dos métodos para animarlo:

-(void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    [self showButton]; 
} 

Y el método:

-(void) showButton { 
    [myButton setTitle:[self getButtonTitle] forState:UIControlStateNormal]; 

    // animate in 
    [UIView beginAnimations:@"button_in" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDone)]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [myButton setFrame:kMyButtonFrameCenter]; // defined CGRect 
    [UIView commitAnimations]; 
} 

El botón aparece inmediatamente y no se animan. Además, el selector animationDone se llama inmediatamente.

¿Por qué no anima mi botón en la pantalla?

EDIT: Esto tiene que tener algo que ver con tratar de iniciar una animación mientras que en viewDidAppear ...

+0

curiosamente, si espero un poco, la animación funcionará. – TigerCoding

Respuesta

6

Probé el código de animación y funciona bien.

¿Dónde se establece el marco inicial del botón? ¿Es posible que establezca erróneamente el marco del botón en kMyButtonFrameCenter antes de comenzar la animación? Eso explicaría por qué el selector animationDone se llama inmediatamente.

Este es el código que funciona:

-(void) showButton { 
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [myButton setTitle:@"test" forState:UIControlStateNormal]; 
    myButton.frame = CGRectMake(-100.0, 100.0, 100.0, 30.0); 
    [self.view addSubview:myButton]; 

    // animate in 
    [UIView beginAnimations:@"button_in" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDone)]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [myButton setFrame:CGRectMake(100.0, 100.0, 100.0, 30.0)]; 
    [UIView commitAnimations]; 
} 

Como se puede ver que no cambia nada en el código animación. Entonces creo que el problema es el marco del botón.

Un poco fuera de tema: si no tienes tu aplicación para iOS < 4, es posible que desees echarle un vistazo a la "animación con bloques" de UIView que viene con iOS 4.0.

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^void{myButton.frame = kMyButtonFrameCenter} completion:^(BOOL completed){NSLog(@"completed");}]; 

=== === EDITAR

Después de leer su comentario, parece que mi sospecha no es correcta. inspire48 apunta en la dirección correcta con su respuesta. Usted debe poner la colocación del botón dentro del método viewDidAppear o en el método showButton para asegurarse de que el botón se coloca fuera de la pantalla antes de se llama a la animación

+0

Intenté colocarlo en viewDidAppear pero no tuvo ningún efecto. Sin embargo, encontré que al usar un temporizador con una demora de 0.2 haría que todo funcionara. – TigerCoding

+1

¿Has intentado hacerlo como lo hice en el código anterior? Porque ahí funciona. ¿Tiene muchos elementos UIE que deben dibujarse cuando aparece la vista? – joern

+0

Sí, acabo de darle un giro. Intenté configurar el marco allí mismo, configurar el 'centro' y algunas otras cosas más. Finalmente, simplemente configuré un temporizador para que se apagara 0.2 segundos después de que aparezca viewDidAppear y todo funciona de esa manera. Todavía no sé por qué. – TigerCoding

3

Ponga la llamada animación en viewDidAppear. viewDidLoad se usa para más configuración de tipo de datos. Cualquier efecto visual como animaciones debe ir en viewDidAppear. Has confirmado esto; funciona si esperas un poco.

+0

La llamada de animación está en viewDidAppear, pero tal vez sea útil poner la ubicación del botón también allí (antes de llamar al método showButton) – joern

+0

Intenté poner la colocación del botón a la vista apareció primero, pero no sirvió. – TigerCoding

Cuestiones relacionadas