2010-11-19 15 views
9

Me gustaría manejar el cambio de orientación en una aplicación de iPad con un UIViewController y dos XIB, digamos MenuView y MenuViewLandscape.Manejar el cambio de orientación en el iPad con un UIViewController y dos XIB

Entonces, en el método willRotateToInterfaceOrientation del MenuViewController, ¿cómo puedo cambiar XIB sin usar otro controlador para el modo horizontal?

estoy usando el siguiente código:

if(toInterfaceOrientation != UIInterfaceOrientationPortrait){ 
    MenuViewController *landscape = [[MenuViewController alloc] 
             initWithNibName: @"MenuViewLandscape" 
             bundle:nil 
            ];   
    [self setView:landscape.view]; 
} 
else { 
    MenuViewController *potrait = [[MenuViewController alloc] 
            initWithNibName: @"MenuView" 
            bundle:nil 
            ];   
    [self setView:potrait.view]; 
} 

Pero cuando voy a ver el paisaje XI ter los controles de vista del paisaje no se giran correctamente.

+0

Ha habido suerte con esto? – RefuX

+0

vea la respuesta a continuación –

Respuesta

12

no estoy seguro de que hay efectos secundarios extraños con esta implementación, pero trata de algo como esto y ver si funciona para usted:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration { 
    if (UIInterfaceOrientationIsPortrait(orientation)) { 
     [[NSBundle mainBundle] loadNibNamed:@"MenuView" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI); 
     } 
    } else if (UIInterfaceOrientationIsLandscape(orientation)){ 
     [[NSBundle mainBundle] loadNibNamed:@"MenuViewLandscape" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationLandscapeLeft) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); 
     } else { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI_2); 
     } 
    } 
} 

Esto supone que el propietario del archivo en su MenuView y Los XIB de MenuViewLandscape están configurados en MenuViewController y también están configurados en ambos XIB. Todos los puntos de venta deben volver a conectarse correctamente en la rotación al usar loadNibNamed.

Si usted está construyendo para iOS 4, también se podría reemplazar a los loadNibNamed líneas con éstos:

UINib *nib = [UINib nibWithNibName:@"MenuView" bundle:nil]; 
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = portraitView; 

y

UINib *nib = [UINib nibWithNibName:@"MenuViewLandscape" bundle:nil]; 
UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = landscapeView; 

Estos asumen que la UIView que desea mostrar inmediatamente sigue el Los objetos proxy de Propietario de archivo y Primer Respondedor en los XIB.

Entonces sólo tiene que asegurarse de que los puntos de vista se rotan adecuadamente para la orientación de la interfaz. Para todas las vistas que no están en la orientación vertical predeterminada, rótelas estableciendo la propiedad transform de la vista y usando CGAffineTransformMakeRotation() con los valores apropiados como se muestra en el ejemplo anterior.

La rotación por sí sola podría resolver su problema sin la carga adicional de los NIB. Sin embargo, cargar una instancia completamente nueva de MenuViewController y configurar su vista a la vista existente de MenuViewController puede causar un comportamiento extraño con el ciclo de vida y los eventos de rotación, por lo que puede estar más seguro con los ejemplos anteriores. También le ahorran la molestia de tener que crear nuevas instancias MenuViewController cuando solo necesita la vista desde allí.

Espero que esto ayude!

Justin

+0

Hola Justin.He intentado con tu solución y funciona bien para Portrait. Sin embargo, para Landscape todo está borroso. Girada correctamente, pero con texto borroso y etiquetas, todo bastante borroso. Algunas líneas son irregulares. Algunas ideas ? gracias. – TrekOnTV2017

1

Tal vez la respuesta de Jon Rodríguez que aquí va a hacer lo que quiere:

Want to use muliple nibs for different iphone interface orientations

Si tiene dos clases UIViewController, una clase base para el modo de retrato y una subclase de que para modo paisaje, puede poner casi todo el código en la clase base. Por lo que le da la mayor parte de las ventajas de una sola clase controlador de vista al mismo tiempo que le permite utilizar otras soluciones como esta:

Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape?

Cuestiones relacionadas