2012-01-05 16 views
7

Estoy agregando un UIView a un UIWindow que no es la ventana clave. Me gustaría que el UIView gire cuando el dispositivo gira. ¿Alguna propiedad especial en la ventana o la vista que necesito establecer? Actualmente, la vista no está girando.La subvista UIView de UIWindow no gira

Soy consciente del hecho de que solo la primera subvista de la aplicación keyWindow se informa sobre las rotaciones del dispositivo. Como prueba agregué mi vista a la primera subvista del keyWindow. Esto hace que la vista gire. Sin embargo, la vista que es una subvista de la primera subvista keyWindow no funcionará por varias razones estéticas.

Un enfoque alternativo es observar los cambios de orientación del dispositivo en la vista y escribir el código de rotación yo mismo. Sin embargo, me gustaría evitar escribir este código si es posible (tener una ventana adicional es más limpio, en mi opinión).

Respuesta

7

UIView no maneja las rotaciones, UIViewController sí. lo tanto, todo lo que necesita es crear un UIViewController, que implementa shouldAutorotateToInterfaceOrientation y diferencia a este controlador como un RootViewController a su UIWindow

Algo así:

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]; 

y yo usamos este MyViewController, porque yo quiero para reflejar los cambios de aplicación principal

@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 

pero siempre se puede simplemente volver SÍ para cualquier orientación o escribir su lógica, si lo desea.

+0

Tengo un problema similar - UIWindow y sus vistas no parecen estar girando - y esta solución no parece funcionar para mi. Hago que el control raíz de la ventana sea un controlador que está rotando con éxito sus subvistas, pero las subvistas de la ventana no rotan en absoluto. –

+0

Y no deberían, porque no se han unido a UIViewController y solo UIViewController administra la rotación –

+0

Esta es una gran respuesta, gracias. Hace la rotación en una ventana secundaria "Just Work". Para eliminar la ventana de la pantalla más tarde, simplemente configure su rootViewController en nil, y la referencia a sí misma también, para que ARC pueda desasignarlo. – nobre

2

Puede añadir a continuación el código a su proyecto

[[NSNotificationCenter defaultCenter] addObserver: auto selector: @selector (didRotate :) nombre: UIDeviceOrientationDidChangeNotification objeto: nil];

y se creó la función para manejarlo.

+0

Prefiero obtener la rotación para "gratis" en lugar de escribir 'didRotate' – SundayMonday

Cuestiones relacionadas