8

Io uso il seguente codice come estensione di UINavigationController per spingere un controller di vista con un'animazione personalizzata:Spingendo un UITableViewController con animazione personalizzata anima la sempre UINavigationItem Titolo

@implementation UINavigationController (PushAnimation) 

- (void)pushViewController:(UIViewController*)controller withTransition:(UIViewAnimationTransition)transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [self pushViewController:controller animated:NO]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.view cache:YES]; 
    [UIView commitAnimations]; 
} 

@end 

Con il caching abilitato, ottengo un comportamento di animazione strano quando si preme un UITableViewController. Il titolo della vista spinta appare dopo che l'animazione personalizzata è stata completata. Con lo stile di transizione UIViewAnimationTransitionNone, diventa chiaro che il titolo stesso è animato. Viene spostato dall'angolo in alto a sinistra dello schermo al centro di UINavigationBar.

Con la memorizzazione nella cache disabilitata, questa animazione non è visibile a causa della sua velocità, ma la frequenza fotogrammi diminuisce in modo significativo.

Come si impedisce l'animazione del titolo?

+1

Penso che l'animazione del titolo stia accadendo nel codice 'UINavigationBar'. Un'idea sarebbe quella di sottoclasse anche quella e cambiare il comportamento predefinito – adig

risposta

0

Solo un aggiornamento rapido che cosa era la mia correzione alla fine. Non è stato possibile ignorare il comportamento predefinito di UINavigationBar, poiché iOS utilizza l'API privata per implementare l'animazione. Così ho finito per la rimozione di tutte le animazioni sul UINavigationBar, e le sue varie subviews, utilizzando il seguente codice:

[self.navigationBar.layer removeAllAnimations]; 
for (UIView *view in self.navigationBar.subviews) { 
    [view.layer removeAllAnimations]; 
    for (UIView *sub in view.subviews) { 
     [sub.layer removeAllAnimations]; 
    } 
} 

E 'importante che questo è chiamato dopo [self pushViewController:controller animated:NO];.

0

Il problema sei animazione vista intera self.view. self.view contiene il controller di visualizzazione e lo UINavigationBar. Quindi probabilmente dovresti ottenere tutte le sottoview di self.view e quindi animare solo il view relativo al tuo controller di visualizzazione.

+0

Bene, voglio anche animare la barra di navigazione, poiché voglio che l'intero schermo cambi, non solo il contenuto sotto la UINavigationBar. Il problema è che non riesco a disabilitare la navigazione predefinita di UINavigationbar. –

0

Usa questo codice per personalizzare l'animazione di transizione di navigazione in un modo molto semplice:

CATransition* transition = [CATransition animation]; 
transition.duration = 0.5; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom; 
transition.subtype = kCATransitionFromRight; 
[self.navigationController.view.layer addAnimation:transition forKey:nil]; 
[[self navigationController] popViewControllerAnimated:NO]; 

e la stessa cosa per spingere.

** Assicurati di #import <QuartzCore/QuartzCore.h> nella classe, e anche aggiungere il quadro al progetto

destinazione> Crea Fasi> Collegamento binario con le librerie> il pulsante "+"> QuartzCore.framework

. **

Problemi correlati