2012-10-17 15 views
6

Sto avendo un controller di visualizzazione split personalizzato nella mia app con un controller master e un controller dettagliato.Supporto di diversi orientamenti in iOS 6.0 per diversi controller di vista

- (id)initWithMasterController:(UIViewController*)aMasterController 
      detailedController:(UIViewController*)aDetailedController; 

I controller forniti per il controller master e il controller dettagli sono UINavigationController.

Come parte della mia app, ci sono due casi possibili per la movimentazione di orientamento:

  1. Quando sei combinazione di controller sono utilizzati in master e dettagli di controllo, tutti gli orientamenti sono supportati per l'applicazione.
  2. Quando c'è un dispositivo StudentDetailsViewController solo sul controller dettagli, è possibile supportare solo due possibili orientamenti. (Paesaggio)

Quando mai l'orientamento del dispositivo è cambiato, accadono le cose qui sotto nelle versioni sotto iOS 6,0

  1. Il metodo -shouldAutorotateToInterfaceOrientation: viene chiamato. L'implementazione di tale metodo è la seguente: In fase di esecuzione, inoltro la richiesta al controller principale e al controller dettagli con la stessa chiamata.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
        BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation] 
           && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
        return res; 
    } 
    
  2. del masterController -shouldAutorotateToInterfaceOrientation ritornerà TRUE. Di seguito l'implementazione del metodo in StudentViewController.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
        return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation) 
            : UIInterfaceOrientationIsPortrait(interfaceOrientation); 
    } 
    

la possibilità di ottenere informazioni sul nuovo orientamento di essere cambiato mi aiuta a decidere se la rotazione deve essere attivata o meno.

Con iOS 6.0:

Quando mai l'orientamento del dispositivo è cambiato, le cose accadono al di sotto nelle versioni di iOS 6,0

  1. Il metodo -shouldAutorotate del controller visualizzazione di divisione viene chiamato. La sua attuazione è al di sotto

    - (BOOL)shouldAutorotate { 
        BOOL res = [masterController shouldAutorotate] 
           && [detailedController shouldAutorotate]; 
        return res; 
    } 
    
  2. shouldAutorotate del detailedController chiama il navigationController. L'implementazione della funzione AutoRotate in StudentsController:

    - (BOOL)shouldAutorotate { 
        return YES; 
    } 
    
    - (NSUInteger)supportedInterfaceOrientations { 
        return (UIInterfaceOrientationMaskLandscapeLeft 
          | UIInterfaceOrientationMaskLandscapeRight); 
    } 
    

Ma con iOS 6.0, non sono in grado di controllare l'orientamento. Anche se viene chiamato il metodo supportatoInterfaceOrientations, quando viene chiamato il metodo shouldAutorotate di StudentsDetailsController, dal parametro shouldAutorotatemethod di detailsController, il metodo shouldAutorotateMethod non obbedisce alle opzioni menzionate nel metodo supportedInterfaceOrientations.

UPDATE:

ho letto la documentazione e le note qui sotto sono riportati nel document.

a volte si consiglia di disabilitare la rotazione automatica in modo dinamico. Per esempio , è possibile farlo quando si desidera sopprimere completamente la rotazione per un breve periodo di tempo. È necessario disabilitare temporaneamente le modifiche all'orientamento di per controllare manualmente la posizione della barra di stato (ad esempio quando si chiama il metodo setStatusBarOrientation: animated:).

Se si desidera disattivare temporaneamente la rotazione automatica, evitare manipolando le maschere di orientamento per eseguire questa operazione. Sostituire invece il metodo shouldAutorotate sul controller di visualizzazione in primo piano. Questo metodo è chiamato prima di eseguire qualsiasi autorotazione. Se restituisce NO, la rotazione viene soppressa.

È possibile disattivare temporaneamente la rotazione automatica in base all'orientamento corrente?

+0

La formattazione del codice non poteva essere fatto correttamente .. – Krishnan

+0

avete risolto il problema? Ho lo stesso problema e non riesco a capire come gestire questo sia per ios5 e 6 – Stas

+0

No, non l'ho risolto .. – Krishnan

risposta

0

Credo che questo sia un qualche tipo di problema in iOS in cui rootViewController non consulta il childViewController per il loro orientamento preferito. Tuttavia, dovresti provare qualcosa come la seguente:

if (self.interfaceOrientation != UIInterfaceOrientationPortrait) 
{ 
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait]; 
} 

per cambiare l'orientamento in verticale per una determinata vista.

0

Nella classe delegato dell'applicazione definire il seguente metodo, questo metodo viene chiamato prima di qualsiasi altro metodo di rotazione nell'applicazione.

Creare un flag (isRotationEnabled) che deciderà l'orientamento della vostra app.

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {  

return self.isRotationEnabled ? 
    UIInterfaceOrientationMaskAll : 
    UIInterfaceOrientationMaskPortrait; 
} 

Modifica questo flag in base a diverse condizioni in voi app utilizzando il seguente codice

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.isRotationEnabled = NO; 
Problemi correlati