L'autorotazione viene gestita da un UIViewController di una vista (shouldAutorotateToInterfaceOrientation:
), pertanto un approccio consiste nell'ordinare la propria gerarchia in modo che le viste ruotabili siano gestite da un controller di visualizzazione e da viste non ruotabili da un altro controller di visualizzazione. Entrambe le viste radice di UIViewController devono quindi essere aggiunte alla finestra/superview.
La sottigliezza è che se si dispone di due viste vista del controller sullo stesso piano (vale a dire aggiunto tramite addSubview:
), solo il primo controller della vista (di solito della finestra rootViewController
) riceverà il messaggio shouldAutorotateToInterfaceOrientation:
.
Ho utilizzato questo approccio da solo per ottenere una barra degli strumenti che ruota, mentre la vista principale no.
Apple's Technical Q&A QA1688 ("Why won't my UIViewController rotate with the device?") parla un po 'di questo problema.
Aggiornamento per iOS 6:
autorotazione ora utilizza shouldAutorotate
e supportedInterfaceOrientations
metodi UIViewController
s'. shouldAutorotate
restituisce YES
per impostazione predefinita, ma ricorda che un controller di visualizzazione diverso da rootViewController
la cui vista è una vista secondaria diretta della finestra NON riceverà comunque callback di rotazione.
Codice di esempio per iOS 6:
crea un nuovo progetto utilizzando il modello "Single View Application" e garantire "Usa storyboard" sia selezionata. Useremo la classe ViewController
fornita come controller di visualizzazione rotante (rinominala se vuoi!) E creiamo una seconda sottoclasse UIViewController
chiamata NonRotatingViewController
. Anche se questo controller della vista sarà mai nemmeno ricevere i callback di rotazione, per completezza e chiarezza aggiungere il seguente codice nel NonRotatingViewController.m
:
- (BOOL)shouldAutorotate
{
return NO;
}
Nel file MainStoryboard
, trascinare un nuovo oggetto View Controller e impostare questa categoria per NonRotatingViewController
, e imposta l'ID Storyboard su "NonRotatingVC". Mentre sei lì, cambia il colore di sfondo della vista del controller di visualizzazione rotante per cancellare (la vista non rotante verrà aggiunta al di sotto di questa) e aggiungere un'etichetta a ciascuna vista.In AppDelegate.m
, aggiungere il codice seguente:
#import "NonRotatingViewController.h"
// ...
// ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
NonRotatingViewController *nonRotatingVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"NonRotatingVC"];
[self.window addSubview:nonRotatingVC.view];
return YES;
}
Questo è solo istanziare un controller non vista ruotare e aggiungendo la sua vista direttamente alla finestra (N.B. a questo punto della finestra rootViewController
già impostato dal storyboard).
Eseguire il progetto. Ruota il dispositivo e meraviglia alla vista di un'etichetta che ruota mentre l'altra rimane ferma!
codice di esempio pre iOS 6:
Ho fatto questo in un nuovo progetto - una nuova applicazione Visualizza-based farà bene. Aggiungi due nuovi controller di visualizzazione: RotatingViewController
e NonRotatingViewController
. All'interno di ciascuno dei loro pennini ho appena aggiunto un'etichetta per descrivere se la vista dovrebbe ruotare o meno. Aggiungere il seguente codice:
'RotatingViewController.m
'
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
'NonRotatingViewController.m
'
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) { // Or whatever orientation it will be presented in.
return YES;
}
return NO;
}
'AppDelegate.m
'
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RotatingViewController *rotating = [[RotatingViewController alloc] initWithNibName:@"RotatingViewController" bundle:nil];
self.rotatingViewController = rotating;
[rotating release];
NonRotatingViewController *nonRotating = [[NonRotatingViewController alloc] initWithNibName:@"NonRotatingViewController" bundle:nil];
self.nonRotatingViewController = nonRotating;
[nonRotating release];
[self.window addSubview:self.rotatingViewController.view];
[self.window insertSubview:self.nonRotatingViewController.view belowSubview:self.rotatingViewController.view];
[self.window makeKeyAndVisible];
return YES;
}
Spero che questo aiuti.
Una soluzione semplice: http://stackoverflow.com/a/6292506/294884 – Fattie