9

Tutti i controller di visualizzazione nella mia app funzionano solo in verticale, tranne uno che può essere orientato in verticale o orizzontale.iOS: cambia l'orientamento dell'interfaccia quando si utilizza il controller pop view

ho qualche scenario di utilizzo come segue:

  1. spingo controllo che funziona in entrambi gli orientamenti per UITabBarController
  2. utente cambiamento dell'orientamento da portait al paesaggio
  3. stampa
  4. utente "pulsante Indietro"

Dopo queste azioni l'applicazione rimane in orientamento orizzontale e non cambia automaticamente in verticale.

Controllo dell'orientamento del controller della vista mediante supportedInterfaceOrientations (utilizzo iOS 6.0). Cosa faccio di sbagliato? Come posso ottenere un comportamento corretto quando l'applicazione cambia automaticamente l'orientamento quando è consentito quando l'utente preme il pulsante Indietro? Grazie per la risposta!

+0

Dai un'occhiata a questo link [http://stackoverflow.com/questions/12650137/how-to-change-the-device-orientation-programmatically-in-ios-6](http://stackoverflow.com/questions/12650137/how-to-change-the-device-orientation-programmatic-in-ios-6) –

+0

Questo scenario è spiegato nella documentazione di Apple [qui] (https://developer.apple.com/library/ ios/featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html # // apple_ref/doc/uid/TP40007457-CH7-SW13). –

risposta

2

In iOS 6 (e possibilmente in precedenza), se un controller di visualizzazione è offscreen quando il dispositivo ruota, non riceve alcuna notifica. Né viene inviato willAnimateRotationToInterfaceOrientation:duration: quando diventa il controller vista superiore.

È necessario tenere traccia dell'orientamento corrente del controller della vista e controllare l'orientamento del dispositivo in viewWillAppear:. Se sono diversi, è possibile utilizzare willAnimateRotationToInterfaceOrientation:duration: per impostarlo correttamente.

Poiché è probabile che si tratti di un'operazione molto generica, è possibile creare una superclasse generica ereditata dai controller di visualizzazione.

A soluzioni tipiche è:

@implementation MyHandlesOffscreenRotationController 
{ 
    BOOL isShowingPortrait; 
} 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    isShowingPortrait = UIInterfaceOrientationIsPortrait(
         [[UIApplication sharedApplication] statusBarOrientation]); 
} 


- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

     BOOL currIsPortrait = UIInterfaceOrientationIsPortrait(
           [[UIApplication sharedApplication] statusBarOrientation]); 

    if ((isShowingPortrait && !currIsPortrait) || 
     (!isShowingPortrait && currIsPortrait)) { 
     [self willAnimateRotationToInterfaceOrientation: 
       [[UIApplication sharedApplication] statusBarOrientation] 
               duration:0.0f]; 
    } 
} 

@end 
+0

Questa è una risposta decente, eccetto che devi impostare 'isShowingPortrait' dopo aver ruotato, quindi è stato aggiornato. altrimenti funzionerà solo una volta. (funziona anche per iOS7) – zero3nna

1

Basta ignorare -(BOOL)shouldAutoRotate and - (NSUInteger)supportedInterfaceOrientations all'interno di una categoria UINavigationController, quindi ViewController forzerà ruotare per l'orientamento sostenuto dopo il pop da altri ViewController.

@implementation UINavigationController (Rotate) 

- (BOOL)shouldAutorotate 
{ 
    return [self.topViewController shouldAutorotate]; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
2

iOS 9 e sopra

Al momento della comparsa basta scrivere il codice qui sotto citati nel vostro viewWillAppear metodo .

[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]forKey:@"orientation"]; 

Con questo, la visualizzazione verrà visualizzata in modalità verticale.

Problemi correlati