Ho un'app per iPhone che utilizza a UINavigationController
per presentare un'interfaccia drill-down: prima una vista, poi un'altra, fino a quattro livelli di profondità. Voglio che le prime tre viste siano limitate all'orientamento verticale e solo l'ultima vista possa ruotare in orizzontale. Quando si torna dalla quarta alla terza vista e la quarta vista era in orientamento orizzontale, voglio che tutto ruoti di nuovo in verticale.
In iOS 5 ho semplicemente definito shouldAutorotateToInterfaceOrientation:
in ciascuno dei miei controller di visualizzazione per restituire SÌ per gli orientamenti consentiti. Tutto ha funzionato come descritto sopra, incluso il ritorno alla modalità verticale anche se il dispositivo era tenuto in orientamento orizzontale quando si tornava dal controller di visualizzazione n.
In iOS 6 tutti i controller di visualizzazione ruotano in orizzontale, interrompendo quelli che non erano previsti. Le note di rilascio di iOS 6 dicono
Maggiore responsabilità si sta trasferendo all'app e al delegato dell'app. Ora, i contenitori iOS (come
UINavigationController
) non consultano i loro figli per determinare se devono ruotare automaticamente. [...] Il sistema richiede al controller di visualizzazione a schermo intero più in alto (in genere il controller di visualizzazione principale) gli orientamenti dell'interfaccia supportati ogni volta che il dispositivo ruota o ogni volta che viene presentato un controller di visualizzazione con lo stile di presentazione modale a schermo intero. Inoltre, gli orientamenti supportati vengono recuperati solo se questo controller di visualizzazione restituisce YES dal suoshouldAutorotate
metodo. [...] Il sistema determina se un orientamento è supportato intersecando il valore restituito dalsupportedInterfaceOrientationsForWindow:
metodo dell'app con il valore restituito dalsupportedInterfaceOrientations
metodo del controller a schermo intero più in alto.
Quindi ho sottoclasse UINavigationController
, ho dato la mia MainNavigationController
proprietà booleana landscapeOK
e l' ho usato per restituire gli orientamenti consentiti in supportedInterfaceOrientations
. Quindi in ciascuno dei viewWillAppear:
metodi dei controller di visualizzazione ho una riga come questa
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
per dirmi MainNavigationController
il comportamento desiderato.
Ecco la domanda: se ora passo alla mia quarta vista in modalità verticale e capovolgo il telefono, ruota in orizzontale. Ora premo il pulsante Indietro per tornare alla mia terza visualizzazione che dovrebbe funzionare solo in verticale. Ma non ruota indietro. Come posso farlo fare?
Provai
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
nel viewWillAppear
metodo del mio terzo controller di visualizzazione, ma non fa nulla. Questo è il metodo sbagliato da chiamare o forse il posto sbagliato per chiamarlo o dovrei implementare l'intera cosa in un modo completamente diverso?