5

Possiedo un UINavigationController. Ho creato VC1 come rootViewController e caricato in modo programmato VC2 da VC1 e quindi l'animazione personalizzata per passare da VC1 a VC2. Standard. Tutto va bene e bene.Personalizza animazione UINavigationController: CATransition

Ora, mi piacerebbe avere un'animazione personalizzata tra i due in questo modo: Custom animation

In sintesi, diapositive VC1 di vista mentre VC2 è sotto di esso. Proprio come una pila di carta in cui si fa scorrere il primo foglio (VC1) e si rivela così il foglio sottostante (VC2).

Quindi quello che ho provato è il seguente codice che viene chiamato da VC1 per arrivare a VC2. Ma ci sono problemi con esso:

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

I problemi sono i seguenti:

  1. VC2 non è fisso in background. È anche una sorta di diapositive (anche se ho specificato kCATransitionReveal). Voglio essere VC2 completamente fisso sullo sfondo.
  2. VC1 si dissolve. Non so davvero perché. Non ho usato kCATransitionFade o simili, quindi non riesco a vedere da dove viene la dissolvenza.

Qualsiasi suggerimento perché non ottengo i risultati attesi sarebbe molto apprezzato. Scusa se è ovvio, ma ci sto provando da ore e mi sono sentito davvero frustrato.

risposta

1

Suppongo che l'unico modo per farlo è quello di dimenticare UINavigationController e venire con la mia meccanismo per gestire tutto:

This blog explains how...

Quindi, se si voleva animazioni personalizzate tra VC, non utilizzare UINavigationController . Ecco un codice di esempio da scambiare tra due VC come descritto sopra:

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

Penso che dovresti usare [[self navigationController] pushViewController:vctwo animated:NO]; anziché animated:YES.

+0

Grazie Ole, l'ho modificato e VC2 non si sposta più. Avrei dovuto pensarci. Qualche idea sulla dissolvenza, però? Non riesco ancora a vedere da dove provenga l'animazione in dissolvenza. –

+0

Penso che la dissolvenza sia in realtà parte integrante dell'animazione UINavigationController e non riesco a liberarmene. Sei a conoscenza di un modo per disattivare l'animazione di dissolvenza personalizzata implementata da UINavigationController? –