7

ho UIViewController su iPad con questa configurazione:non willRotateToInterfaceOrientation essere chiamato dalla presentato viewcontroller

shouldAutorotate (true) supportedInterfaceOrientations (UIInterfaceOrientationMaskAll) e dentro willRotateToInterfaceOrientation effettuo qualche trucco per regolare la mia interfaccia.

Da un bambino di questo controller, mostro un QuickLookController con questo codice di errore.

[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:previewController animated:YES completion:nil]; 

Ma se ruoto il mio iPad il metodo willRotateToInterfaceOrientation non essere chiamato, quindi non posso fare il trucco per regolare l'interfaccia.

Qualcuno può spiegarmi o darmi dei consigli? grazie

risposta

12

Motivo: Ci possono essere molte possibilità per questo problema.

1) se del viewController tuo punto di vista è un subView di qualche altro rootViewController che non è un navigationController, allora ci potrebbe essere possibilità che la chiamata di rotazione non si propaga al controllore di visualizzazione secondaria.

2) qualche parte ho letto che se Super metodi non vengono chiamati correttamente dove è necessario allora potrebbe essere la causa del problema rotazione, il che significa che tutti ViewControllers in vista pila che sono collegati al autorotazione devono chiamare i super metodi nelle implementazioni del metodo (ovvero chiamando [super viewDidLoad] da ViewController's viewDidLoad).

È possibile utilizzare sotto il trucco per gestire le modifiche di orientamento.

Registrare un notificatore in viewWillAppear.

-(void)viewWillAppear:(BOOL)animated{ 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];} 

Il cambiamento di orientamento notificherà la funzione seguente.

- (void)orientationChanged:(NSNotification *)notification{ 
[self handleOrientation:[[UIApplication sharedApplication] statusBarOrientation]];} 

che chiamerà il metodo riportato di seguito in cui è possibile gestire le modifiche di orientamento.

- (void) handleOrientation:(UIInterfaceOrientation) orientation { 

     if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) 
     { 
      //handle the portrait view  
     } 
     else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
     { 
      //handle the landscape view 
     } 
    } 
+0

Motivo numero 2 risolto il mio problema ... Super deve essere chiamato – lucaslt89

4

ho trovato un paragrafo sulla documentazione di Apple:

Se il contenuto del vostro controller della vista non sono sullo schermo quando si verifica una rotazione, quindi non vede l'elenco dei messaggi di rotazione. Ad esempio, considerare la seguente sequenza di eventi:

  • Il controller di visualizzazione presenta a schermo intero un altro contenuto del controller di visualizzazione.
  • L'utente ruota il dispositivo in modo che l'orientamento dell'interfaccia utente cambi.
  • L'app chiude il controller della vista presentato.

In questo esempio, il controller della vista di presentazione non era visibile quando si è verificata la rotazione, quindi non riceve alcun evento di rotazione. Invece, quando riappare, le sue viste vengono semplicemente ridimensionate e posizionate usando il normale processo di layout della vista. Se il codice del layout deve conoscere l'orientamento corrente del dispositivo, può leggere la proprietà statusBarOrientation dell'oggetto dell'app per determinare l'orientamento corrente.

che dire esattamente qual è il mio problema, quindi aggiungo una certa logica all'interno - (void) viewWillAppear: (BOOL) animato per regolare il mio layout se qualcosa is'n nel posto giusto.

0

Verificare che il controller di visualizzazione sia aggiunto come figlio del controller di visualizzazione radice, quindi i messaggi vengono passati.

[rootViewController addChildViewController:viewController]; 
Problemi correlati