Ottieni l’orientamento attuale di iPad?

In un determinato gestore di eventi (non nel metodo “shouldAutorotateToInterfaceOrientation”) come faccio a rilevare l’orientamento corrente di iPad? Ho un campo di testo che devo animare (quando appare la tastiera) nella vista orizzontale, ma non nella vista verticale e voglio sapere quale orientamento sono per vedere se l’animazione è necessaria.

Le informazioni di orientamento non sono molto coerenti e ci sono diversi approcci. Se in un controller di visualizzazione, è ansible utilizzare la proprietà interfaceOrientation . Da altri posti puoi chiamare:

 [[UIDevice currentDevice] orientation] 

In alternativa, puoi richiedere di ricevere notifiche di modifica dell’orientamento:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

Ad alcune persone piace anche controllare l’orientamento della barra di stato:

 [UIApplication sharedApplication].statusBarOrientation 

credo

 [[UIDevice currentDevice] orientation]; 

non è veramente affidabile A volte funziona, a volte no … Nelle mie app, io uso

 [[UIApplication sharedApplication]statusBarOrientation]; 

e funziona benissimo!

Uno di:

  • Controlla la proprietà interfaceOrientation del controller di visualizzazione attivo.
  • [UIApplication sharedApplication].statusBarOrientation .
  • [UIDevice currentDevice].orientation . (Potrebbe essere necessario chiamare -beginGeneratingDeviceOrientationNotifications .)

Ho trovato un trucco per risolvere il problema dell’orientamento di FaceUp !!!

Ritarda il controllo dell’orientamento fino a dopo che l’app è stata avviata, quindi imposta le variabili, visualizza le dimensioni, ecc. !!!

 //CODE - (void)viewDidLoad { [super viewDidLoad]; //DELAY [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(delayedCheck) userInfo:nil repeats:NO]; } -(void)delayedCheck{ //DETERMINE ORIENTATION if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ){ FACING = @"PU"; } if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown ){ FACING = @"PD"; } if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ){ FACING = @"LL"; } if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight ){ FACING = @"LR"; } //DETERMINE ORIENTATION //START [self setStuff]; //START } -(void)setStuff{ if( FACING == @"PU" ){ //logic for Portrait } else if( FACING == @"PD" ){ //logic for PortraitUpsideDown } else{ if( FACING == @"LL"){ //logic for LandscapeLeft } else if( FACING == @"LR" ){ //logic for LandscapeRight } } //CODE 

Puoi aggiungere le viste di presentazione, gli elementi di posizione, ecc. Nella funzione ‘setStuff’ … tutto ciò che inizialmente dipenderà dall’orientamento !!!

: D

-Chris Allinson

È ansible ottenere questo in due modi:

1- Usando il seguente metodo:

** Inserisci la seguente riga nel metodo -(void)viewDidLoad :

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

quindi metti questo metodo nella tua class

 -(void)deviceRotated:(NSNotification*)notification { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { //Do your textField animation here } } 

Il metodo sopra controllerà l’orientamento quando il dispositivo verrà ruotato

2- Il secondo modo è inserire la seguente notifica all’interno -(void)viewDidLoad

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 

quindi inserisci il seguente metodo all’interno della tua class

 -(void)checkRotation:(NSNotification*)notification { UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { //Do your textField animation here } } 

Il metodo di cui sopra controllerà l’orientamento della barra di stato dell’iPad o dell’iPhone e in base ad esso si eseguirà l’animazione nell’orientamento richiesto.

Per la determinazione di landscape vs portrait, esiste una funzione integrata:

 UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation); 

[UIApplication sharedApplication].statusBarOrientation restituisce portrait quando è orizzontale e orizzontale quando è ritratto al momento del lancio, in iPad

Non so perché, ma ogni volta che inizia la mia app, i primi 4 hanno ragione, ma successivamente ho l’orientamento opposto. Io uso una variabile statica per contare questo, quindi ho un BOOL per capovolgere come invio manualmente questo a subviews.

Quindi, mentre non sto aggiungendo una nuova risposta stand-alone, sto dicendo di usare quanto sopra e tenere questo in mente. Nota: sto ricevendo l’orientamento della barra di stato, poiché è l’unica cosa che viene chiamata all’avvio dell’app ed è “abbastanza corretta” per aiutarmi a spostare le cose.

Il problema principale con l’utilizzo di questo è il modo in cui le viste vengono caricate pigramente. Assicurati di chiamare la proprietà view dei tuoi contenuti e sottoview “Before”, imposta le loro posizioni in risposta al loro orientamento. Grazie a Apple per non andare in crash quando impostiamo variabili che non esistono, costringendoci a ricordare che rompono OO e ci costringono a farlo anche … gah, un sistema così elegante eppure così rotto! Seriamente, adoro Native, ma non va bene, incoraggia un design OO scadente. Non è colpa nostra, basta ricordare che la tua funzione di ridimensionamento potrebbe funzionare, ma Apple’s Way richiede di caricare la vista usando, non creando e inizializzando

Nel controller della vista, ottieni il valore di sola lettura di self.interfaceOrientation (l’orientamento corrente dell’interfaccia).

Ho provato molti dei metodi di cui sopra, ma niente sembrava funzionare al 100% per me.

La mia soluzione era di creare un iVar chiamato orientamento di tipo UIInterfaceOrientation nel Root View Controller.

 - (void)viewDidLoad { [super viewDidLoad]; orientation = self.interfaceOrientation; // this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use. } - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ return YES; } -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ orientation = toInterfaceOrientation; } 

Quindi, in qualsiasi posto in cui è necessario controllare l’orientamento, puoi fare qualcosa del genere:

  if(UIInterfaceOrientationIsPortrait(orientation)){ // portrait }else{ // landscape } 

Potrebbe esserci ancora un modo migliore, ma questo sembra funzionare il 98% delle volte (nonostante iOS5) e non è troppo difficile. Nota che iOS5 avvia sempre iPad in modalità ritratto, quindi invia un dispositivo a willRotateTo- e ha fattoRotateFromInterfaceOrientation: messages, quindi il valore sarà ancora inaccurato brevemente.

[UIDevice currentDevice].orientation funziona alla grande.

MA!!! … il trucco è aggiungerlo a (void)viewWillAppear:(BOOL)animated

exp:

 (void)viewWillAppear:(BOOL)animated{ ... BOOL isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation); ... } 

Se lo chiami a – (void)viewDidLoad , non funziona in modo affidabile, specialmente se usi più thread (thread principale dell’interfaccia utente, thread in background per accedere a enormi dati esterni, …).


Commenti: 1) Anche se l’app imposta il ritratto di orientamento predefinito, l’utente può bloccarlo in orizzontale. Quindi impostare l’impostazione predefinita non è davvero una soluzione per aggirare il problema. 2) Ci sono altri compiti come hide la barra di navigazione, da posizionare a viewWillAppear per farlo funzionare e allo stesso tempo prevenire lo sfarfallio. Lo stesso vale per altre viste come UITableView willDisplayCell -> usarlo per impostare cell.selected e cell.accessoryType.