2012-06-23 13 views
5

In un segue personalizzato, ho il seguente semplice transizione:Animazione personalizzata per UINavigationController Non spingere il rendering barra di navigazione in modo corretto

- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 
    [UIView transitionWithView:src.navigationController.view duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        animations:^{ 
         [src.navigationController pushViewController:dst animated:NO]; 
        } 
        completion:NULL]; 
} 

Il contenuto vista anima bene. Tuttavia, quando si esegue l'animazione, la barra di navigazione nella parte superiore ha un layout incasinato (i pulsanti sono tutti stipati nell'angolo in alto a sinistra, senza titolo), che si aprono solo quando l'animazione è terminata. Qualcuno sa cosa ho fatto di sbagliato e come risolverlo? Grazie!

risposta

5

Ho capito il mio problema. Il codice originale è effettivamente errato, dato che UINavigationController funziona e interagisce con i UIViewControllers che gestisce. (Roba Fastidiosamente come quello che ho fatto nel PO può essere trovato come una soluzione in vecchio, e quindi i messaggi.)

Ecco il codice che funziona per me (con un piccolo inconveniente):

- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 
    [UIView transitionFromView:src.view 
         toView:dst.view 
         duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        completion:nil]; 
    [UIView transitionFromView:src.navigationItem.titleView 
         toView:dst.navigationItem.titleView 
         duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        completion:nil]; 
    [src.navigationController pushViewController:dst animated:NO]; 
} 

Quibble: questo sarà animare la barra di navigazione separatamente dalla vista del contenuto, in modo da avere due pezzi che girano invece dell'intero schermo. Avevo inizialmente cercato di fare:

[UIView transitionFromView:src.navigationController.view 
         toView:dst.navigationController.view 

Ma che non riesce perché la proprietà navigationController la) della destinazione 1 non è nemmeno ancora impostato fino a quando è spinto su un controller di navigazione, e 2), anche se fosse sarei riferendo alla stessa vista! Ho dimenticato che

La vista di un controller di navigazione è solo un contenitore per diversi altre viste, tra cui una barra di navigazione, una barra degli strumenti opzionale, e la vista contenente il materiale personalizzato ... Anche se il contenuto del navigazione Visto bar e barra degli strumenti cambia, il punto di vista se stessi Do non ... l'oggetto controller di navigazione costruisce il contenuto della barra di navigazione utilizzando in modo dinamico gli elementi di navigazione (istanze della classe UINavigationItem) associati ai controller di vista sulla la pila di navigazione. Per modificare il contenuto della barra di navigazione, , è necessario configurare gli elementi di navigazione per i controlli personalizzati della vista personalizzata . (docs)

+0

Qualcuno può spiegare perché questo è stato downvoted? – qix

+0

Grazie mille! Il codice snipped mi ha aiutato a capire come posso animare solo la barra di navigazione durante la commutazione, ma non la commutazione della visualizzazione del contenuto – Denis

0

Un altro "cavillo"? ho messo

[src.navigationController pushViewController:dst animated:YES]; 

prima

[UIView transitionFromView ... 

in modo che il controller di navigazione era raggiungibile metodo viewDidLoad della destinazione.

Problemi correlati