iphone - Personalizar animación UINavigationController: CATransición
cocoa-touch core-animation (2)
Creo que deberías usar [[self navigationController] pushViewController:vctwo animated:NO];
en lugar de animated:YES
.
Tengo un UINavigationController. Hice VC1 el controlador raíz y cargué programáticamente VC2 desde VC1 y luego la animación personalizada pasó de VC1 a VC2. Estándar. Todo está bien y bien.
Ahora, me gustaría tener una animación personalizada entre los dos, así:
En resumen, VC1 se desliza fuera de la vista mientras VC2 está debajo de él. Al igual que una pila de papel donde se desliza la primera hoja (VC1) y, por tanto, revela la hoja debajo (VC2).
Entonces, lo que probé es el siguiente código que se llama desde VC1 para llegar a VC2. Pero hay problemas con eso:
MyVC2 *vctwo = [[[MyVC2 alloc] init] autorelease];
CATransition *transition = [CATransition animation];
transition.duration = 1;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromRight;
transition.delegate = self;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[[self navigationController] pushViewController:vctwo animated:YES];
Los problemas son los siguientes:
- VC2 no está fijo en el fondo. Se desliza también (aunque he especificado kCATransitionReveal). Quiero ser VC2 totalmente reparado en segundo plano.
- VC1 se desvanece. Realmente no sé por qué. No usé kCATransitionFade o similar, así que no puedo ver de dónde viene el fundido.
Cualquier sugerencia de por qué no estoy obteniendo los resultados esperados sería muy apreciada. Lo siento si esto es obvio, pero estoy intentando esto por horas y realmente me sentí frustrado.
Supongo que la única forma de hacerlo es olvidando UINavigationController y crear mi propio mecanismo para manejar todo:
Por lo tanto, si desea realizar animaciones personalizadas entre VC, no use UINavigationController. Aquí hay un código de muestra para intercambiar entre dos VCs como se describe arriba:
-(void)slideDoorOpenTo:(UIViewController *)aController duration:(float)aDuration {
[aController viewWillAppear:YES];
[activeController viewWillDisappear:YES];
//aController.view.alpha = 0.0f;
[self.view insertSubview:aController.view belowSubview:activeController.view]; // so that it is below activeController
[aController viewDidAppear:YES];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:aDuration];
aController.view.transform = CGAffineTransformMakeTranslation(0,0);
activeController.view.transform = CGAffineTransformMakeTranslation(-320,0);
[UIView commitAnimations];
[self performSelector:@selector(animationDone:) withObject:aController afterDelay:aDuration];
}