L’autenticazione GameCenter nell’app solo per l’ambiente genera UIApplicationInvalidInterfaceOrientation

Problema: se l’utente non ha effettuato l’accesso all’account GameCenter, la visualizzazione dell’autenticazione di GameCenter viene avviata in modalità verticale (in iOS 5 c’era una finestra di dialogo modale) che richiede di accedere. Ma se disattivo la modalità Ritratto in xcode (Riepilogo progetto) o in SupportInterfaceOrientationsForWindow: (poiché la mia app dovrebbe funzionare SOLO in modalità landscape) ottengo:

Terminazione dell’app a causa dell’eccezione non rilevata ‘UIApplicationInvalidInterfaceOrientation’, motivo: ‘Gli orientamenti supportati non hanno un orientamento comune con l’applicazione e shouldAutorotate restituisce SÌ’

Se abilito Portrait per ipad / iphone (e / o commenta supportatoInterfaceOrientationsForWindow 🙂 funziona senza crash, ma non voglio che la modalità portrait sia abilitata.

Mentre scrivo questa domanda e sto sperimentando con il codice, sembra che abbia trovato una soluzione: abilita tutti gli orientamenti nel riepilogo del progetto e rimuovi l’applicazione: supportedInterfaceOrientationsForWindow.

Aggiungi questo codice a ViewController:

- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 

Ora funziona perfettamente.

Aggiungi al delegato dell’app:

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)w { return (NSUInteger)[application supportedInterfaceOrientationsForWindow:w] | (1< 

Ho scoperto che il problema sta venendo dal Game Center nel mio caso. Quando nel simulatore non ho ancora inizializzato il Game Center, vorrebbe far apparire la vista di login, ma in modalità verticale. Una volta raggiunto questo punto, si blocca se non si consente l’orientamento verticale. Strano bug nel sistema operativo come Game Center dovrebbe prendere gli orientamenti consentiti solo per essere in linea con la nostra intenzione di interfaccia utente paesaggio.

Non ho ancora la soluzione, ma posterò se la trovo.

Ho avuto lo stesso problema di te e l’ho risolto con un brutto lavoro, fondamentalmente ho una variabile globale nella mia app che uso per scegliere quali sono gli orientamenti di interfaccia validi. Nel

  - (NSInteger)application : (UIApplication *)supportedInterfaceOrientationsForWindow:(UIWindow *)window{ if(orientationIndicator == 1){ return UIInterfaceOrientationMaskAllButUpsideDown; } else if(orientationIndicator == 2){ return UIInterfaceOrientationMaskLandscape; } } 

Per dichiarare la variabile globale inserisci questo nel tuo file appDelegate.m:

  int orientationIndicator = 1; 

Per importare la variabile globale utilizzare:

  extern int orientationIndicator; 

Quindi puoi cambiare il valore dell’indicatore di orientamento e ti permetterà di eseguire diversi tipi di interfaccia. Quindi quello che ho fatto è stato iniziare impostando orientationIndicator = 1. Quando si autentica un lettore e si avvia il controller della vista di accesso, impostare l’indicatore di orientamento su 2. Quando si chiude la vista (autenticare il lettore), è ansible cambiarlo nuovamente in 1 .

Questo è un lavoro viscido ma ha funzionato per me.

Spero che questo ti aiuti!

Cattura l’eccezione sembra funzionare bene per me:

 @try { [rootNavigationController pushViewController:viewController animated:YES]; } @catch (NSException *exception) { //somehow, catching this exception just allows the view controller to be shown? } 

In iOS 6.0 viene lanciata l’eccezione, ma se la si cattura, il viewController verrà comunque mostrato e GameCenter si comporterà come previsto nell’orientamento orizzontale.

Una soluzione alternativa è quella di indirizzare iOS 6.1 e versioni successive, poiché Apple ha corretto il bug di quella versione.