Sono venuto a SO in cerca di una soluzione più elegante, ma ecco come sono stato (con successo) a farlo finora.
L'idea di base:
- Non utilizzare UINavigationController; invece utilizzare le sue parti costituenti (ad esempio UINavigationBar) e fare il lavoro da soli
- trigger la barra di navigazione per animare in parallelo con le proprie animazioni personalizzate (o non, se non si desidera anim a tutti)
I lati negativi:
- UINavigationController gestisce alcune altre cose, come il caricamento/scaricamento della memoria, automaticamente. Inoltre, è "hard coded" in tutti i UIViewControllers: hanno SEMPRE un riferimento al UINavigationController che li contiene. È un peccato buttare tutto questo solo perché Apple non fornisce un gancio per l'impostazione di animazioni personalizzate.
Codice - in qualsiasi classe assume per l'animazione:
UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"];
[navigationController.navigationBar pushNavigationItem:backItem animated:TRUE];
// next line only needed if you want a custom back anim too
navigationController.navigationBar.delegate = self;
... se anche voi volete tagliare-in con l'abitudine di nuovo l'animazione, è necessario che l'ultima riga sopra, in modo da può quindi ascoltare la barra di navigazione e reagire in parallelo, in questo modo:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
// trigger your custom back animation here
return TRUE;
}
Perché si vuole rompere l'interfaccia utente con un comportamento non standard? –
Non voglio interrompere l'interfaccia utente con un comportamento non standard. Semplicemente non capisco perché le funzioni dell'SDK controllino che una spinta sia animata o meno, ma non ha lo stesso controllo per un pop. Sento che è incoerente. –
comportamento non standard ci fa crescere :) – Zac