2010-11-02 12 views
13

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.

+1

forse un bug? ;) –

+0

la domanda afferma che stai apportando la modifica in DetailViewController, è che il controller corretto sta sovrascrivendo il metodo? –

+0

Ho già segnalato il bug – nacho4d

risposta

2

Ho fatto una domanda con una taglia di 500 che seems to be the same thing you're facing.

Dalla mia esperienza limitata è molto più semplice realizzare un'app per iPhone solo per paesaggio che per un'app per iPad solo per paesaggio. Non sono sicuro del motivo per cui c'è qualche differenza, ma i passi che Apple dice di fare per renderlo solo orizzontale non funzionano da soli.

+0

Penso di aver trovato un suggerimento in quel thread, Ecco quello che ho fatto e ha funzionato, ma questo è sicuramente un work-arround. Questo non dovrebbe essere necessario, credo. Vedi il mio aggiornamento2. – nacho4d

+0

Anche duro mi sono trovato la risposta ... questa risposta mi ha portato ad esso. Quindi grazie;) – nacho4d

0

Dai un'occhiata a questo iPhone app in landscape mode, se non l'hai già fatto. Stavo suggerendo semplicemente di aggiungere UISupportedInterfaceOrientations al tuo Info.plist e di specificare i due orientamenti del paesaggio. Ma, a quanto pare, questo non è sufficiente, secondo le risposte alla domanda citata.

1

Prova questo (che funziona):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation { 
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 
+0

modifica la condizione "se" in base alla modalità in cui desideri inserirla. Il codice sopra riportato lo limita a landscape right. Cambia il controllo "if" su UIInterfaceOrientationLandscapeLeft per bloccare a sinistra. Per entrambe le modalità landscape, do if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) – Sid

+0

Non ha funzionato ... Questo è sufficiente quando non si utilizza UISplitViewController, credo. – nacho4d

+0

'UIInterfaceOrientationIsLandscape (interfaceOrientation);' è la macro Apple a fare ciò che hai detto nella risposta a breve. Quindi il richiedente ha fatto quello che hai detto di fare. –

0

Credo che questo sia un bug, ho affrontato questo problema anche. E 'qualcosa a che fare con

UIInterfaceOrientationLandscapeLeft 

Per replicare a questa situazione:

1) Creare un nuovo progetto iPad utilizzando template UISplitViewController

2) Modifica info.plist

Supported interface orientations 
-Landscape (left home button) 
-Landscape (right home button) 

3) DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// return YES; 
NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft); 
return interfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
} 

4) Esegui .... Vedrai una vista nera vuota. e non importa come ti giri. "UIInterfaceOrientationLandscapeLeft" mai rilevato.

A proposito, nacho4d 's aggiungere il controllo BOOL work-around sta lavorando. Pollice in Su :)

Problemi correlati