Ho la mia applicazione iPad creata utilizzando il modello SplitView. Mi chiedo quale sia il modo migliore per limitare la mia applicazione alla modalità orizzontale?Come limitare la mia app alla modalità orizzontale?
Ho provato override shouldAutorotateToInterfaceOrientation:
Procedimento DetailViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
ma 4.2 GM ancora buggy e riesce a mostrare la visualizzazione controllore. Quali altre scelte ho?
Grazie in anticipo.
Update1
ho già presentato un bug report: Bug ID #8620135
La mia app è quasi finito e devo trovare un lavoro arround poiché non credo che risolverà questo prima che il 4.2 esca ufficialmente (GM è già uscito!)
Per ricreare il bug, basta usare il modello di SplitView e sovrascrivere sopra Metodo in qualsiasi UIViewControllers (RootViewController o DetailViewControllers)
UPDATE2
ho trovato una soluzione alternativa. (Vedere Update3 per il completo work-around)
Set UISupportedInterfaceOrientations solo per sostenere Paesaggio, questo costringerà l'applicazione per avviare in modalità orizzontale che permette DetailViewController per avviare correttamente (da qui mostrato correttamente)
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Ma se si ruota il dispositivo, si trasforma in modalità Ritratto !!!, quindi è ancora necessario eseguire l'overrideshouldAutorotateToIntercafeOrientation
: come sopra
Discussione:
Se questo non fosse un errore mi aspetterei un avviso o un errore di esecuzione, un'eccezione o qualcosa del genere quando si avvia l'app in un orientamento non supportato dal controller della vista. Inoltre, perché solo DetailViewController non viene visualizzato? Se questa fosse una specifica, allora anche RootViewController dovrebbe non riuscire a caricare. Non pensi? grazie per l'aiuto ...;)
Update3
Dopo ulteriori test ho capito che sopra work-around non funziona in alcuni casi. Ad esempio quando si avvia l'app quando il dispositivo è in orizzontale non funzionerà !. Il vero problema sembra essere che in iOS4.2GM UISplitViewController ha bisogno che tutti i suoi controllori abbiano tutte le rotazioni disponibili al suo tempo di caricamento. Quindi è necessario ingannarlo in modo che si carichi in modalità orizzontale e quindi non gli consenta di ruotare i suoi controller di visualizzazione.
Quindi ecco il nuovo work-around per questo fastidioso iBug.
Step1: Set Info.plist in questo modo:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Step2 Impostare una nuova bandiera in DetailViewController.m o .h (da SplitView Template)
BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//WORK-ARROUND: Bug ID# 8620135.
if (lockRotation) {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}else{
return YES;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
//set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called
lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
}
- (void)viewDidAppear:(BOOL)animated {
//set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called
lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135.
[super viewDidAppear:animated];
}
NOTA IMPORTANTE: Si prega di notare che questo bug appare solo quando UISplitViewController è caricato e non ogni volta appare la sua vista. Quindi, per vedere questo bug assicurati che l'app sia stata terminata prima.
forse un bug? ;) –
la domanda afferma che stai apportando la modifica in DetailViewController, è che il controller corretto sta sovrascrivendo il metodo? –
Ho già segnalato il bug – nacho4d