2011-05-24 15 views
16

¿Cuál es la forma "correcta" de colocar y mover exactamente vistas cuando rota una aplicación? Es decir, ¿cómo puedo tener un control detallado de la posición, el tamaño y el reflujo de mis vistas cuando la IU gira de orientación vertical a horizontal (o viceversa)? Creo que mis dos opciones son:Colocación y desplazamiento de vistas en rotación (UIView)

  1. Utilice dos supervistas (vertical y horizontal). En rotación: alternar entre ellos.
  2. Usa una supervista. En rotación: cambie el marco, los límites y las propiedades del centro de cada subvista.

Si tiene dos vistas con diseños y elementos lo suficientemente distintos, entonces la primera manera podría ser suficiente. Si sus dos vistas son esencialmente del mismo tamaño para diferentes orientaciones, la segunda forma es probablemente una mejor manera de hacerlo con una sola vista.

Sospecho que el primero se puede hacer con IB y el último se debe hacer mediante programación.

portrait to landscape

Respuesta

9

para tener un control preciso sobre la posición y el tamaño de sus subvistas cuando el iPhone gira, cambiar el marco de las subvistas en el método UIViewController willAnimateRotationToInterfaceOrientation:duration:. Este método se llama dentro de un bloque de animación, por lo que todos los cambios en los marcos de las subvistas que realice en su interior están animados.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) { 
     // Portrait frames 
     self.subviewA.frame = CGRectMake(x, y, width, height); 
     self.subviewB.frame = CGRectMake(x, y, width, height); 
     self.subviewC.frame = CGRectMake(x, y, width, height); 
    } else { 
     // Landscape frames 
     self.subviewA.frame = CGRectMake(x, y, width, height); 
     self.subviewB.frame = CGRectMake(x, y, width, height); 
     self.subviewC.frame = CGRectMake(x, y, width, height); 
    } 
} 
+0

Eso es todo, gracias. Estaba intentando establecer la propiedad de transformación, pero me comporté de una manera extraña. –

0

Aquí hay una idea. Me preocupa que las animaciones funcionen graciosas, pero pruébalo y ve.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation 
           duration:(NSTimeInterval)duration { 

    if (toOrientation == UIInterfaceOrientationLandscapeLeft || 
     toOrientation == UIInterfaceOrientationLandscapeRight) { 
     [UIView beginAnimations:nil context:NULL]; { 
      [UIView setAnimationDuration:1.0]; 
     } 
      [UIView setAnimationDelegate:self]; 
     [viewA setFrame:CGRectMake(?,?,?,?)]; 
     [viewB setFrame:CGRectMake(?,?,?,?)]; 
     [viewC setFrame:CGRectMake(?,?,?,?)]; 
     } [UIView commitAnimations];  
    } else if (toOrientation == UIInterfaceOrientationPortrait || 
      toOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     [UIView beginAnimations:nil context:NULL]; { 
      [UIView setAnimationDuration:1.0]; 
     } 
     [UIView setAnimationDelegate:self]; 
     [viewA setFrame:CGRectMake(?,?,?,?)]; 
     [viewB setFrame:CGRectMake(?,?,?,?)]; 
     [viewC setFrame:CGRectMake(?,?,?,?)]; 
     } [UIView commitAnimations];  
    } 
+0

Creo que necesitas 'setFrame' en lugar de' setBounds' – Lukman

0

Tengo una idea que está funcionando correctamente para mí donde yo estoy usando una pequeña vista en una vista en la que gira a sí mismo cuando la orientación de cambios de dispositivo. Use un notificador luego en el método cambie la orientación.

#define DegreesToRadians(x) (M_PI * x/180.0) 

.......

[[NSNotificationCenter defaultCenter] addObserver:showIndicator 
             selector:@selector(setProperOreintation) 
              name:UIDeviceOrientationDidChangeNotification 
              object:nil]; 

.......

-(void)setProperOrientation { 

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 


if (orientation == UIDeviceOrientationPortraitUpsideDown) 
    self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DegreesToRadians(180)); 

else if (orientation == UIDeviceOrientationLandscapeLeft) 
    self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DegreesToRadians(90)); 

else if (orientation == UIDeviceOrientationLandscapeRight) 
    self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DegreesToRadians(-90)); 

    [UIView commitAnimations]; } 

Aquí en lugar de rotar u puede utilizar traducir o escala

0

Hay hay muchas soluciones para eso. Uno de ellos es animaciones para controles como lo leyó antes. Otra opción es preparar 2 UIView one para el modo vertical y otro para el modo horizontal. Y en la orientación del interruptor: cargue UIView apropiado. Esa es la forma que utilicé en mis aplicaciones. Porque a veces las diferencias entre paisaje y retrato son enormes.

En casos simples es suficiente para configurar correctamente autoresizingMask para las subvistas. Lee sobre ello. Funciona realmente bien.

Cuestiones relacionadas