2010-11-21 4 views
6

[Domanda aggiornata]Qual è il modo corretto per rilevare l'orientamento dell'interfaccia all'avvio?

Quindi ecco il problema, ho finalmente ristretto a questo. Se si crea un nuovo UIViewController in tutti i metodi

- (id)init; 
- (void)loadView; 
- (void)viewDidAppear:(BOOL)animated; 
- (void)viewDidLoad; 
(...) 

L'interfaceOrientation standard è ritratto e se viene rilevata la modalità orizzontale sarà rapidamente ruotare l'orientamento. Che possono poi essere rilevate utilizzando il:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 

Il problema è che sul iPad, è difficile tranquillo per preparare la vostra interfaccia per l'orientamento dell'interfaccia corrente all'interno del loadview (o uno degli altri) come sarà soltanto il ritorno Ritratto. Ciò causerà alcuni problemi:

1) Desidero ricaricare il contenuto in modalità portait, ma NON in modalità orizzontale. Normalmente inserirò un'istruzione if in loadView. Se in modalità verticale, ricarica il contenuto. Ma in questo caso restituirà sempre un ritratto e quindi carica sempre il contenuto.

2) Desidero utilizzare 'presentPopoverFromRect: inView: allowedArrowDirections: animated:' - metodo in modalità verticale per visualizzare automaticamente il menu popover all'avvio dell'applicazione. Ciò causerà il crash dell'applicazione quando viene avviato in modalità verticale. Motivo: "I popover non possono essere presentati da una vista che non ha una finestra.".

L'unica ipotesi sicura è all'interno di "didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation", ma questo metodo non verrà attivato se si avvia in modalità verticale.

// ----

Aggiornamento (15.37)

'UIApplicationWillChangeStatusBarOrientationNotification'

saranno pubblicati solo quando l'utente swap da verticale a orizzontale (o vice versa). Se l'interfaccia è stato il problema, allora questo può essere facilmente risolto con l'osservazione per la notifica e

if (UIDeviceOrientationIsPortrait(interfaceOrientation)) { 
    // layout subviews for portrait mode 
} else { 
    // layout subviews for landscape mode 
} 

Ma il problema è che vorrei sapere in quale modalità è al momento del lancio di determinare piuttosto devo o non devo ricaricare il contenuto , Non riesco a ricaricare il contenuto e quando si passa a landscape lo annullo.

+0

Ho provato a fare il controllo per 'UIDeviceOrientationIsPortrait()' in 'layoutSubviews' di un costume' UIView' sottoclasse e sto ottenendo gli orientamenti corretti. Avete un po 'più codice che potreste condividere che potrebbe aiutare a identificare qual è il problema? Ci si chiede inoltre se i valori UIDeviceOrientation e UIInterfaceOrientation possano essere utilizzati in modo intercambiabile? Questo mi ha fatto rimanere bloccato con strani bug prima d'ora. – justinkmunger

risposta

8

Prova [[UIApplication sharedApplication] statusBarOrientation].

+0

È diverso da [[UIApplication sharedApplication] statusBarOrientation]? – Mark

+0

Gah mi dispiace per quello. La risposta è aggiornata –

1

io non sono sicuro se questo sarà effettivamente risolvere il mio problema, ma guardando la documentazione ho trovato la seguente:

typedef enum { 
    UIInterfaceOrientationPortrait   = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, 
    UIInterfaceOrientationLandscapeLeft  = UIDeviceOrientationLandscapeRight, 
    UIInterfaceOrientationLandscapeRight  = UIDeviceOrientationLandscapeLeft 
} UIInterfaceOrientation; 

e

typedef enum { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait, 
    UIDeviceOrientationPortraitUpsideDown, 
    UIDeviceOrientationLandscapeLeft, 
    UIDeviceOrientationLandscapeRight, 
    UIDeviceOrientationFaceUp, 
    UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 

Quindi, dal momento a faccia in su e faccia in giù sono stati aggiunti guardando l'orientamento del dispositivo è inutile per ragioni di interfaccia. Quindi, in teoria, @MarkAdams ha ragione a dire che in questo caso [[UIApplication sharedApplication] statusBarOrientation] dovrebbe essere usato per l'orientamento dell'interfaccia.

Ovviamente il UIViewController ha l'opzione 'interfacciaOrientazione'.

6

Il modo corretto è chiedere al dispositivo l'orientamento come una vista tecnicamente priva di orientamento. ;)

Quindi hai ragione nell'uso di . Da documentation è possibile vedere che è necessario innanzitutto generare notifiche di orientamento del dispositivo prima che queste informazioni siano corrette. Quindi funzionerà come desiderato.

UIDevice *myDevice = [UIDevice currentDevice]; 
[myDevice beginGeneratingDeviceOrientationNotifications]; 
UIDeviceOrientation currentOrientation = [myDevice orientation]; 
[myDevice endGeneratingDeviceOrientationNotifications]; 

Nota: Questo vi dà l'orientamento attuale del dispositivo. Se il controller della vista attualmente visibile/superiore ha fatto non consentire la rotazione a questo orientamento, si otterrà comunque l'orientamento del dispositivo corrente, non quello attualmente utilizzato dal controller di visualizzazione più in alto.


Modifica dopo domanda è stata aggiornata:

Lei ha ragione che l'orientamento per il più in alto controller della vista (ha funzionato correttamente per i controller visualizzazione secondaria) restituisce sempre 1 (cioè UIInterfaceOrientationPortrait) in loadView. Tuttavia, verrà immediatamente chiamato il metodo willRotateToInterfaceOrientation:duration: e l'orientamento passato è corretto, quindi dovresti essere in grado di utilizzare tale metodo.

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toIfaceOrient 
           duration:(NSTimeInterval)duration 
+0

Hey Pascal, che funzionerebbe per l'UIDevice tuttavia non è quello che sto cercando. Ho finalmente ristretto il bug, aggiornerò la mia domanda. – Mark

+0

Ho aggiornato la risposta, forse quel metodo è una soluzione al tuo problema. – Pascal