2010-06-25 11 views
14

La mia applicazione ha un controller di navigazione e non voglio alcuna animazione in esso:Previeni l'animazione quando fai clic sul pulsante "Indietro" in una barra di navigazione?

  • per evitare un'animazione quando si spinge la vista, è facile, tramite la pushViewController: animato: metodo

  • ma quando clicco il pulsante "indietro" in questa sottoview, c'è un'animazione! KO! Cosa posso fare per impedire questa animazione?

+7

Perché si vuole rompere l'interfaccia utente con un comportamento non standard? –

+10

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. –

+1

comportamento non standard ci fa crescere :) – Zac

risposta

3

Più elegante con una categoria. Questo presuppone che l'oggetto del controller di navigazione sia impostato nel delegato dell'app. Basta metterlo prima di @implementaion nel controller della vista radice.

#import "AppDelegate.h" 

@implementation UINavigationBar (custom) 
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated; 
{ 

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

    [delegate.navController popViewControllerAnimated:NO]; 

    return TRUE; 
} 


@end 
+1

Grazie per la tua risposta, l'ho appena provato e funziona davvero, ma è sorprendente perché si restituisce TRUE per qualcosa che si aspetta un UINavigationItem. –

+1

Inoltre, questa soluzione funziona se hai 1 e solo 1 controller di navigazione nella tua app. Non funzionerà con più controller di navigazione. –

+0

è solo un rimbalzo sulla mia testa. Spiegazione Plz. sono nuovo bie Thals –

2

Non che si dovrebbe, tuttavia è possibile ignorare il comportamento standard per la creazione di un custom leftBarButtonItem nella vostra viewController.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)]; 
[[self navigationItem] setLeftBarButtonItem:item]; 
[item release]; 

- (void)backButtonPressed 
{ 
    [[self navigationContoller] popViewControllerAnimated:NO]; 
} 

Il documentation dice che si dovrebbe passare solo NOprima viene visualizzato vista del controller nav.

Ricordare che le applicazioni che non sono conformi alle linee guida per l'interfaccia iPhone non saranno accettate nell'app store.

+0

Quel codice è bacato, e anche allora funziona solo parzialmente. Non otterrai il pulsante di forma "freccia". Digitare nel codice: manca "]" sulla riga 1. Inoltre, il codice nella riga 2 non è corretto - credo che dovrebbe essere visualizzato: "[self.navigationItem setLeftBarButtonItem: item];" w.r.t. "è accettabile da Apple": 1. Non è vero: molte delle applicazioni che violano il HIG sono accettate; molte delle applicazioni di Apple lo violano in modo flagrante. 2. Ogni volta che si desidera eseguire una coppia di animazione push/pop personalizzata, è NECESSARIO disabilitare quella predefinita (poiché Apple non fornisce un'API pubblica per sovrascriverla). – Adam

+0

Grazie per la risposta. Tuttavia, sono d'accordo con Adam: la forma a "freccia" è un MUST in un'applicazione per iPhone. –

+0

È sempre possibile ricreare l'immagine della freccia. Penso che sia una pratica abbastanza comune, dal momento che Apple non ti dà il modo di crearne uno a livello di programmazione. – livingtech

3

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:

  1. Non utilizzare UINavigationController; invece utilizzare le sue parti costituenti (ad esempio UINavigationBar) e fare il lavoro da soli
  2. 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:

  1. 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; 
} 
+0

Grazie per la tua risposta! Ma hai ragione: sono troppo pigro per buttare via tutte le funzionalità di UINavigationController e preferisco consentire l'animazione;) –

+3

*** Termina l'app a causa dell'eccezione non rilevata 'NSInternalInconsistencyException', motivo: 'Impossibile impostare manualmente il delegare su una UINavigationBar gestita da un controller. ' –

+0

Rileggi il punto 1 sopra – Adam

3

questo modo si evita l'animazione di default.

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 

Nel caso in cui se hai bisogno di un'animazione personalizzata

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 

    CATransition *transition = [CATransition animation]; 
    transition.duration = 0.3; 
    transition.type = kCATransitionFade; 
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 
Problemi correlati