2012-09-24 13 views
5

So che è necessario utilizzare i nuovi metodi di rotazione per IOS6, ma sembra che il metodo che ho scritto non funzioni.Problema di rotazione IOS6

ho settati mio file plist per consentire a tutti la rotazione ma non portraitUpsideDown

Ho poi avuto il seguente nel mio AppDelegate:

self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
[self.window setRootViewController:navController]; //add nav controller to be the root view 

Poi nel mio rootView, per spingere a un altro controller , Ho:

WebViewViewController *webController = [[JBWebViewViewController alloc] init]; 
webController.urlString = urlName; 
[self.navigationController pushViewController:webController animated:YES]; 

E Nel controller Web ho ve:

#pragma mark - System Rotation Methods 
//for any version before 6.0 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
//only allow landscape 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

/for 6.0+ 
- (BOOL)shouldAutorotate{ 
return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
return UIInterfaceOrientationMaskPortrait; 
} 

Quello che voglio fare, è quello di consentire 3 rotazioni nella vista principale, ma quando passare alla visualizzazione Web (da notare lo faccio spingere la navigazione, non aggiunge visualizzazione secondaria), voglio solo consentire visualizzazione verticale .

Qualcuno mi aiuti per favore

------- ---------- UPDATE

Ho creato il mio navController sottoclasse di UINavigationController, ho un landscapeModeOn BOOL che posso installare per raccontare specifiche rotazione automatica

#pragma mark - System Rotation Methods 
//for any version before 6.0 
- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation 
{ 
    if (landscapeModeOn) { 
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
    } else { 
    return interfaceOrientation == UIInterfaceOrientationPortrait; 
    } 
} 

//for 6.0+ 
- (NSUInteger)supportedInterfaceOrientations{ 
    if (landscapeModeOn) { 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
    } else { 
    return UIInterfaceOrientationMaskPortrait; 
    } 
} 

- (BOOL)shouldAutorotate{ 
    UIInterfaceOrientation ori = [UIDevice currentDevice].orientation; 
    if (landscapeModeOn) { 
    return ori != UIInterfaceOrientationPortraitUpsideDown; 
    } else { 
    return ori == UIInterfaceOrientationPortrait; 
    } 
} 

NEL subviews carico, lo faccio:

- (void)viewWillAppear:(BOOL)animated{ 
    //get nav controller and turn off landscape mode 
    JBNavController *navController = (JBNavController*)self.navigationController; 
    [navController setLandscapeModeOn:NO]; 
    [navController shouldAutorotate]; 
} 

-------------------- Fare riferimento alla citazione della migliore risposta Per IOS6, la mela si sta ora concentrando sull'utilizzo del layout automatico dello storyboard insieme alle nuove definizioni di rotazione, è difficile correggere alcuni bug piccoli per IOS6 basati sulle iOS 4.3 e iOS 5 di codifica struttura

Da applefreak, il suo suggerimento accennato su:

Una sfida principale nel tuo caso non gestisce gli orientamenti. In realtà è il blocco delle diverse view controller a particolare orientamento

Sebbene manuale Ruota vista sembra davvero difficile fare a meno di eventuali bug, ma sembra l'unica soluzione ora sto provando, vi posto ancora una volta risolto

+0

Secondo la risposta di rooster117, questa è la mia soluzione: [http://stackoverflow.com/questions/12662240/how-to-make-app-fully- lavoro-correttamente-per-autorotazione-in-ios-6/12.662.433 12.662.433 #] [1] [1]: http://stackoverflow.com/questions/12662240/how-to-make-app -solo-funzionante-correttamente-per-autorotazione-in-ios-6/12662433 # 12662433 – Carina

risposta

2

Il seguente codice è errato!

- (BOOL)shouldAutorotate{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

Ricordare che supportatoInterfaceOrientations viene chiamato solo se shouldAutoRotate restituisce SÌ. Ora i controller della vista radice decidono se i bambini ruotano o meno.

Nel vostro caso suggerirei di avere un controller di classe base per il vostro self.viewController e impostare self.viewController su root view controller not navigationController altrimenti i metodi di rotazione non saranno invocati! Mi sono imbattuto in questo stesso problema. Dovresti avere una relazione HAS-A con il controller della vista di base ed i suoi figli. Restituisce Sì/No da ShouldAutoRotate in base ai bambini attivi e lo stesso per l'orientamento supportato. Se segui questa architettura, sarebbe coerente per l'app complessa.

Ad esempio nel proprio caso BaseviewController deve restituire YES da shouldAutoRotate e restituisce UIInterfaceOrientationPortrait dal delegato dell'orientamento supportato quando webviewController è attivo. Spero che abbia senso.

+0

cheers, ha senso. tuttavia, sembra non avere alcun effetto sul risultato, posso ancora ruotare in modalità orizzontale. – phil88530

+0

Non si può mettere NSLog in shouldAutoRotate e vedere se viene chiamato o meno! Ho avuto lo stesso problema e il codificatore precedente stava usando UINavigationController. Ho dovuto cambiarlo in CustomViewController come controller di visualizzazione radice e il metodo ha iniziato a ricevere chiamate e le rotazioni hanno iniziato a funzionare come previsto. Suppongo solo la modalità ritratto, ma solo alcune schermate ruotano in modalità landscap. – applefreak

+0

Ho eseguito la mia propria classe navController e, per ogni vista, ho impostato il controller di navigazione in base a se voglio solo il ritratto vista o meno. Funziona. Tuttavia, quando carico la vista per la prima volta, non la controlla. Ho chiamato manualmente [navController shouldAutoRotate [quando la vista carica e I NSLog, viene chiamato, ma la vista non ruota (ad es. Radice vista orizzontale entra nella seconda vista solo ritratto, la vista viene ruotata in orizzontale e non ruota indietro, ma se lo ritraggo, ruoterà all'indietro, quindi se lo ricollocio di nuovo, non ruoterà) – phil88530

6

Per Nella tua situazione dovrai sottoclassi il tuo NavigationController e aggiungerai i metodi shouldAutorotate e supportInterfaceOrientations. iOS6 ora richiede il tuo stack di navigazione nell'ordine inverso a iOS5, quindi chiederà prima il tuo NavigationController e se questo restituisce SÌ, non si consulterà nemmeno con i suoi controller di visualizzazione figlio. Per risolvere che è necessario aggiungere la logica a voi stessi di fare questo

Quindi nel tuo controller di navigazione sottoclasse si chiede manualmente il viewcontroller corrente è capacità di autorotazione:

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

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

e nelle vostre singole viewcontrollers ora è possibile implementare quelli funzioni e chiedi loro di restituire i valori desiderati che hai definito nella tua domanda.

Spero che abbia senso.

+0

Ehi: ho avuto il mio webViewController: UINavigationController, e ho implementato il tuo metodo, ma quando clicco il pulsante per ru n: self.navigationController pushViewController: webViewController, it (lldb) e dies – phil88530

+0

Mi assicurerei che tu abbia tutta l'implementazione corretta quando esegui la sottoclasse. Se stai utilizzando IB assicurati che il controller di navigazione sia della classe corretta e se lo stai allocando manualmente assicurati di utilizzare tutte le parole chiave corrette nell'assegnazione. Assumerei che abbia qualcosa di sbagliato in questo. Se no, hai qualche aiuto con l'output? – rooster117

+0

se torni alla mia domanda, ho l'allocazione del controller di navigazione nell'appDelegate, e quindi ho solo il controllo di navigazione nella vista root, sono tutti i posti in cui l'ho avuto. pensi che farò delle modifiche? Ho solo un (lldb), nessun altro messaggio di errore – phil88530

0

E 'codice comune per iOS5 e iOS6

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     // here to implement landscope code 
    } 

    else 
    { 
     // here to implement setframePortrait 
    } 
} 
+0

Sta usando la sostituzione per (bool) autorotateToInterfaceOrientation, è stato deprecato in iOS6 – Comradsky

Problemi correlati