5

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.Personalizar animación UINavigationController: CATransición

Ahora, me gustaría tener una animación personalizada entre los dos, así: Custom animation

En suma, se desliza fuera de la vista VC1 VC2 mientras está debajo de ella. Al igual que una pila de papel donde se desliza la primera hoja (VC1) y, por tanto, revela la hoja debajo (VC2).

Así que lo que probé es el siguiente código que se llama desde VC1 para llegar a VC2. Sin embargo, hay problemas con él:

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:

  1. VC2 no se fija en el fondo. Se desliza también (aunque he especificado kCATransitionReveal). Quiero ser VC2 totalmente reparado en segundo plano.
  2. 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.

Respuesta

1

supongo que la única manera de hacer esto es olvidar UINavigationController y llegar a mi propio mecanismo para manejar todo:

This blog explains how...

Así que si quería a animaciones personalizadas entre los VC, no utilice UINavigationController . Aquí hay un código de muestra para intercambiar entre dos VCs como se describió anteriormente:

-(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]; 


} 
3

Creo que debería usar [[self navigationController] pushViewController:vctwo animated:NO]; en lugar de animated:YES.

+0

Gracias Ole, lo cambié y VC2 ya no se mueve más. Debería haberlo pensado. ¿Alguna idea sobre el fundido, sin embargo? Todavía no puedo ver de dónde viene la animación de fundido de salida. –

+0

Creo que el fundido es en realidad parte de la animación de UINavigationController y parece que no puedo deshacerme de él. ¿Conoces alguna forma de desactivar la animación de desvanecimiento personalizada implementada por UINavigationController? –

Cuestiones relacionadas