8

Ho un UITabBarController presentato in modalità verticale. In una delle schede ho un pulsante che mostra un UIViewController modally (Un semplice storyboard seguito esegue l'azione).Modal View Controller forza Orientamento orizzontale in iOS 6

Desidero che questa vista modale venga visualizzata in modalità orizzontale, ma non riesco a farla girare automaticamente.

ho questo nel controller di vista modale

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

ho aggiunto landscapeLeft alle .plist supportato orientamenti (anche se questo permette anche la TabBar di ruotare, che io non voglio)

ho anche aggiunto questo al viewDidLoad della vista modale

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; 

ma io proprio non riesco a farlo ruotare da sola.

Grazie

EDIT ----

Sembra shouldAutoRotate è nemmeno essere chiamato!

Inoltre, sto provando a rilevare l'orientamento e questo codice sotto mostra sempre 2, indipendentemente dall'orientamento!

if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait) { 
     NSLog(@"1"); 
     self.hostView.frame = CGRectMake(0, 60, 200, 255); 
    } else { 
     NSLog(@"2"); 
     self.hostView.frame = CGRectMake(0, 45, 480, 255); 
    } 

EDIT 2 ---

Il mio male. Suppongo che avrei dovuto dire che stavo usando iOS 6. Il display ruota automaticamente su iOS 5. shouldAutorotateToInterfaceOrientation è deprecato quindi ho bisogno di leggere i nuovi metodi.

+0

dalla mia precedente esperienza con questo, non c'è modo di forzare una viewController ad apparire in un orientamento specifico. Puoi scegliere se consentire o meno l'orientamento di cambiare, ma non forzarlo. è stato un peccato per me ... – KDaker

+0

Questo è davvero un po 'stupido! Ho un grafico che si adatta solo a Landscape. Quindi stai dicendo che Apple vuole che lo mostri fottuto finché l'utente non gira il suo dispositivo. Non sembra corretto, anche se non ho trovato una soluzione, quindi potresti avere ragione. – Darren

risposta

7

Note iOS 6.0 uscita
"Più responsabilità si sta muovendo per l'applicazione e il delegato applicazione ora. , contenitori di iOS (come UINavigationController) non consultano i loro bambini per determinare se essi dovrebbero AutoRotate. "

-(BOOL)shouldAutorotate di UIViewController in qualsiasi contenitore (come UINavigationController) non verrà chiamato da IOS6.

Provato una soluzione utilizzando la categoria per aggiungere il metodo alla classe UINavigationController esistente.

all'interno del metodo shouldAutorotate, è possibile chiamare il metodo shouldAutorotate in ciascun controller di visualizzazione di self.viewControllers. In effetti, puoi passare al tuo controller di visualizzazione figlio.

0

Ho fare esattamente questo nella mia app, e farlo in via shouldAutorotateToInterfaceOrientation, in modo leggermente diverso di quanto si:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    return (YES); 
return (NO); 
} 

per iOS 6, è inoltre necessario impostare window.rootViewController = {il controller di vista radice}; nel tuo delegato dell'app. Spero che questo è il tuo problema

+0

Ciò non forza l'orientamento. Ho aggiunto questo al mio AppDelegate self.window.rootViewController = [[UIStoryboard storyboardWithName: @ "MainStoryboard" bundle: [NSBundle mainBundle]] instantiateViewControllerWithIdentifier: @ "mainTab"]; – Darren

+0

ok bummer, non sto usando gli storyboard nelle mie app, anche se non penserei che questo dovrebbe causare questo problema. Sospetto che la proprietà rootViewController sia impostata automaticamente in ogni caso. Sarebbe interessante registrare le chiamate su shouldAutorotate per vedere se è ancora chiamato – CSmith

+0

No, shouldAutorotate non viene chiamato affatto! – Darren

1

In iOS 6 sembra essere questo metodo può aiutare a forzare un orientamento specifico su iOS 6.

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

sto ancora cercando di farlo funzionare e aggiornerò con qualsiasi risultato.

+0

Grazie, funziona nel mio caso insieme al metodo - (BOOL) shouldAutorotate {return NO;} – Alex

6

Se si vuole forzare la rotazione in iOS6, il vostro RootViewController dovrebbe implementare questi metodi:

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotate { 
    return YES; 
} 
Problemi correlati