2012-01-05 11 views
7

Sto aggiungendo un UIView a un UIWindow che non è la chiave Window. Mi piacerebbe che lo UIView ruoti quando il dispositivo ruota. Eventuali proprietà speciali sulla finestra o sulla vista che devo impostare? Attualmente la vista non sta ruotando.La sottoview UIView di UIWindow non ruota

Sono a conoscenza del fatto che solo la prima sottoview dell'applicazione keyWindow viene comunicata sulle rotazioni del dispositivo. Come test ho aggiunto la mia vista alla prima sottoview dello keyWindow. Questo fa ruotare la vista. Tuttavia, la vista è una sottoview della prima sottoview del keyWindow non funzionerà per vari motivi estetici.

Un approccio alternativo è osservare i cambiamenti di orientamento del dispositivo nella vista e scrivere il codice di rotazione da solo. Tuttavia, vorrei evitare di scrivere questo codice se possibile (avendo una finestra aggiuntiva è più pulita a mio parere).

risposta

7

UIView non gestisce le rotazioni, fa UIViewController. Quindi, tutto ciò che serve è quello di creare un UIViewController, che implementa shouldAutorotateToInterfaceOrientation e imposta questo controller come RootViewController al UIWindow

Qualcosa del genere:

UIViewController * vc = [[[MyViewController alloc] init] autorelease]; 

    vc.view.frame = [[UIScreen mainScreen] bounds]; 
    vc.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4]; 

    //you vc.view initialization here 

    UIWindow * window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.windowLevel = UIWindowLevelStatusBar; 
    window.backgroundColor = [UIColor clearColor]; 
    [window setRootViewController:vc]; 
    [window makeKeyAndVisible]; 

e ho usato questo MyViewController, perché lo voglio per riflettere i cambiamenti di applicazione principale

@interface MyViewController : UIViewController 

    @end 

    @implementation MyViewController 

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    { 
     UIWindow *window = ((UIWindow *)[[UIApplication sharedApplication].windows objectAtIndex:0]); 
     UIViewController *controller = window.rootViewController; 

     if (!controller) { 
      NSLog(@"%@", @"I would like to get rootViewController of main window"); 
      return YES; 
     } 
     return [controller shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; 
    } 
    @end 

ma si può sempre e solo tornare SÌ per qualsiasi orientamento o scrivere la vostra logica, se lo si desidera.

+0

Sto avendo un problema simile - UIWindow e le sue viste non sembrano girare - e questa soluzione non sembra funzionare per me. Rendo il rootViewController della finestra un controller che sta girando con successo i suoi subviews, ma le sottoview della finestra non ruotano affatto. –

+0

E non dovrebbero, perché non sono collegati a UIViewController e solo UIViewController gestisce la rotazione –

+0

Questa è un'ottima risposta, grazie. Rende la rotazione su una finestra secondaria "Just Work". Per rimuovere la finestra dallo schermo in un secondo momento, basta impostare il suo rootViewController su zero e il riferimento a se stesso, in modo che ARC possa deallocarlo. – nobre

2

È possibile aggiungere il codice di seguito al progetto

[[NSNotificationCenter defaultCenter] addObserver: auto selettore: @selector (didRotate :) nome: oggetto UIDeviceOrientationDidChangeNotification: nil];

e creato la funzione per gestirlo.

+0

Preferirei ottenere la rotazione per "libero" invece di scrivere 'didRotate' – SundayMonday

Problemi correlati