2010-09-03 21 views
5

Cuando mis gira interfaz del iPhone, me gustaría hacer un fundido de entrada/fundido de salida para un UIView específica de un UIViewController ... Como ...fundido de entrada/fundido de salida durante una rotación de interfaz de

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.3]; 
    theView.alpha = 0; 
    [UIView commitAnimations]; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.3]; 
    theView.alpha = 1; 
    [UIView commitAnimations]; 
} 

Pero la animación no termina antes del inicio de rotación (que se puede ver la vista a partir de la auto-cambio de tamaño) ...

¿hay una manera de retrasar iniciar la rotación?

"duración" es la duración de la animación giratoria, ¿verdad?

+0

Hola, ¿cómo resolvió su problema? – sergiobuj

+0

No lo resolví. Acabo de configurar la duración de la animación a 0.1s –

Respuesta

7

Encontré que ejecutar el bucle de ejecución actual durante la misma cantidad de tiempo que la animación anterior, de hecho retrasó la rotación.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [UIView animateWithDuration:0.25 animations:^{ 
     theview.alpha = 0.0; 
    }]; 

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; 
} 
0

Su problema proviene del hecho de que cuando se llame a girar a la orientación de la interfaz: la vista girada ya tiene su propiedad de orientación establecida y el bloque de animación que maneja la rotación también está listo para ejecutarse en una secuencia separada. De the documentation:

Este método se llama dentro del bloque de animación utilizado para rotar la vista. Puede anular este método y usarlo para configurar animaciones adicionales que deberían ocurrir durante la rotación de la vista.

Yo sugeriría anulando el shouldAutorotateToInterfaceOrientation: Método para disparar su animación antes de regresar SI para orientaciones compatibles:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
     // Return YES for supported orientations 
     if (interfaceOrientation == (UIDeviceOrientationPortrait || UIDeviceOrientationPortraitUpsideDown) { 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.3]; 
     theView.alpha = 0; 
     [UIView commitAnimations]; 
     } else { 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.3]; 
     theView.alpha = 1; 
     [UIView commitAnimations]; 
     } 
     return YES; 
} 

Esto debería asegurar la animación se ejecuta antes de que usted configura la orientación de UIViewController y el fuego de la rotación animación. Es posible que deba agregar un ligero retraso para obtener el efecto que busca dependiendo de la velocidad del hardware del dispositivo.

Cuestiones relacionadas