2010-08-04 9 views
21

Nella mia app per iPad, ho bisogno di eseguire un codice di layout per impostare il layout corretto in base all'orientamento. Per impostazione predefinita, il layout è configurato per l'orientamento orizzontale, quindi nel caso in cui l'app venga avviata in modalità verticale, è necessario intervenire ulteriormente per configurare correttamente le visualizzazioni per la visualizzazione in verticale.Ottieni l'orientamento di lancio dell'app per iPad

Nel mio metodo -application:didFinishLaunchingWithOptions:, controllo l'orientamento utilizzando [[UIDevice currentDevice] orientation]. Il problema qui è che restituisce sempre il ritratto anche se l'applicazione sta iniziando in orizzontale. C'è un modo per aggirare questo?

risposta

36

Questo è il comportamento previsto. Disse the UIViewController documentation:

Nota: Al momento del lancio, le applicazioni devono sempre costituire la loro interfaccia in un orientamento verticale. Dopo il ritorno del metodo application:didFinishLaunchingWithOptions:, l'applicazione utilizza il meccanismo di rotazione del controller di visualizzazione sopra descritto per ruotare le viste sull'orientamento appropriato prima di mostrare la finestra.

In altre parole, per quanto riguarda il dispositivo concerne l'orientamento è ritratto mentre l'applicazione lancia. Ad un certo punto dopo lo application:didFinishLaunchingWithOptions: verrà rilevato il diverso orientamento e verrà chiamato il tuo metodo shouldAutorotateToInterfaceOrientation: e successivamente il tuo other view rotation methods, che dovrai gestire normalmente.

+0

per l'aiuto pastella o il risultato rapido vedere ..... questo http://stackoverflow.com/questions/5888016/ios-device-orientation-on-load/32758397#32758397 – jenish

0

Si vuole fare in modo di impostare le chiavi corrette nel vostro Info.plist per consentire gli orientamenti che si desidera:

UISupportedInterfaceOrientations 
    UIInterfaceOrientationPortrait 
    UIInterfaceOrientationPortraitUpsideDown 
    UIInterfaceOrientationLandscapeLeft 
    UIInterfaceOrientationLandscapeRight 
+0

Ho tutti e 4 gli orientamenti nel mio file plist. – indragie

13

Uso self.interfaceOrientation nel vostro controller di vista - si tratta di una proprietà di UIViewController impostato dal iOS per te, e in alcuni casi è più affidabile di [[UIDevice currentDevice] orientation].

Ecco una descrizione dettagliata: http://bynomial.com/blog/?p=25

+0

Bella soluzione, come questa. – Roger

+0

Esistono in realtà tre proprietà di orientamento: 'UIDevice.orientation',' UIViewController.interfaceOrientation' e 'UIApplication.statusBarOrientation'. – rpetrich

+0

Semplice e fornisce risultati molto coerenti. – krsteeve

2

Utilizzare la barra di stato orientamento invece di rilevarla.

UIInterfaceOrientation orientation = [UIApplication sharedApplication] .statusBarOrientation;

quindi eseguire le if sull'orientamento che hai ottenuto dall'alto.

+0

Attenzione: InterfaceOrientation (= orientamento barra di stato) è * non * uguale all'orientamento del dispositivo! Pertanto non è adatto per rilevare il rilevamento di un dispositivo. – auco

+2

Per tutti gli scopi, fornisce un risultato di orientamento più coerente e accurato rispetto alla classe UIDevice e al relativo metodo. – Bourne

19

Questo è il modo migliore per verificare l'orientamento all'avvio. In primo luogo, creare un nuovo metodo nella AppDelegate che controlla l'orientamento:

-(void)checkLaunchOrientation:(id)sender{ 

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;  
    BOOL isLandscape = UIDeviceOrientationIsLandscape(self.viewController.interfaceOrientation); 

    if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape) { 
     //do stuff here 
    } 
} 

Alla fine di -application:didFinishLaunchingWithOptions: corsa

 [self performSelectorOnMainThread:@selector(checkLaunchOrientation:) withObject:nil waitUntilDone:NO]; 
+1

Ottima soluzione! Controllo dell'orientamento [[UIDevice currentDevice]] 'da _inside_' -application: didFinishLaunchingWithOptions: 'ha restituito l'orientamento sconosciuto ma il controllo da un metodo eseguito usando' performSelectorOnMainThread: withOptions: waitUntilDone: 'funziona perfettamente. –

+0

NOTA: Non funziona con iOS 7. –

0

Non che avete bisogno di un'altra risposta, ma ho pensato di aggiungere che non vuoi quasi mai usare [[UIDevice currentDevice] orientation]. Questo metodo restituisce l'orientamento del dispositivo, che non è necessariamente uguale all'orientamento dell'interfaccia.

4

Come menzionato in un post del blog sopra, c'è un set di macro per testare l'orientamento. Quel post sul blog cita tuttavia UIDeviceOrientationIsPortrait. Mi piace quanto segue, è una svolta minore.

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) 
{ 
    NSLog(@"Portrait"); 
} 
else 
{ 
    NSLog(@"Landscape"); 
} 

Un'osservazione che ho fatto è che non è possibile chiamare questo codice in una visualizzazione per tabella, spinto a un controller di navigazione integrato nel controller della vista divisa. Quindi, in altre parole, non è possibile chiamarlo dal controller della vista principale. Devi sostituire "self.interfaceOrientation" con splitviewcontroller.interfaceOrientation, assumendo che tu mantenga un riferimento al controllore della vista split genitore.

1

Quindi la domanda riguarda il controllo dell'orientamento all'avvio. La risposta è tristemente "Non puoi".

Ma DOPO avvio, è possibile controllare l'orientamento modo normale (come altri hanno descritto).

Se qualcun altro viene qui in cerca di una risposta, smettere semplicemente di cercare dato che all'avvio la variabile di orientamento non è impostata (tutti i frame/limiti delle viste riportano anche di essere in ritratto anche se non lo sono).

0

Non è vero che non è possibile capire l'orientamento del lancio, è vero che è un dolore nella parte posteriore farlo.

ecco cosa devi fare.

il tuo primo UIViewController deve avere una logica speciale per catturare le informazioni che desideri.
potresti persino voler creare un UIStartupController solo per questi scopi se è così importante per il tuo flusso.
nel caso del mio progetto, avevamo già un controller di avvio simile.

tutto ciò che serve è il seguente codice

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    self.launchOrientation = UIDeviceOrientationUnknown; 
    } 
    return self; 
} 

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration 
{ 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    if (self.launchOrientation == UIDeviceOrientationUnknown && duration > 0) 
    self.launchOrientation = UIInterfaceOrientationPortrait; 
    else 
    self.launchOrientation = toInterfaceOrientation; 
} 

in fondo, se non stiamo lanciando nel UIInterfaceOrientationPortrait, la prima sequenza di rotazione callback sarà effettivamente rivelare l'orientamento del lancio.
se lanciato in UIInterfaceOrientationPortrait, allora dobbiamo controllare che la durata della prima rotazione sia diversa da zero, e quindi sappiamo che è stata lanciata da portrait.