34 votos

iphone/ipad orientación en el manejo de

Esto es más de una pregunta general para las personas que me proporcionan orientación sobre, básicamente Im aprendizaje iPad/iPhone de desarrollo y finalmente han llegado a través de la multi-orientación de la pregunta de soporte técnico.

He buscado una buena cantidad de doco, y mi libro "Principio iPhone 3 Desarrollo" tiene un buen capítulo.

Pero mi pregunta es esta, si yo fuera a través de programación a cambiar mi controles (o incluso el uso de diferentes puntos de vista para cada orientación) ¿cómo en la tierra a las personas a mantener su base de código? Me imagino a muchos de los problemas con los espaguetis código/miles de "si" cheques por todo el lugar, que sería la unidad de me gustan para hacer un pequeño cambio en la interfaz de usuario de acuerdo.

¿Alguien tiene experiencia en el manejo de este problema? Lo que es una buena manera de controlarlo?

Muchas gracias Marca

41voto

Alex Reynolds Puntos 45039

Yo hago esto con los dos métodos simples en mi punto de vista controlador:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self adjustViewsForOrientation:toInterfaceOrientation];
}

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        titleImageView.center = CGPointMake(235.0f, 42.0f);
        subtitleImageView.center = CGPointMake(355.0f, 70.0f);
        ...
    }
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
        titleImageView.center = CGPointMake(160.0f, 52.0f);
        subtitleImageView.center = CGPointMake(275.0f, 80.0f);
        ...
    }
}

Para mantener esta limpia fácilmente puede compartimentar la vista de ajustes/recarga/etc. con los métodos de llamada desde el interior de la sola if-else condicional.

7voto

drawnonward Puntos 35444

Realmente depende de qué es lo que están poniendo.

Si usted mira la Manzana Configuración de la aplicación, se puede ver que el uso de la tabla de puntos de vista para el diseño, con la costumbre de las células para la mayoría de las filas. Con eso, se puede permitir una interfaz sencilla para rotar bastante barato por solo llenar el ancho de las celdas. Esto incluso se aplica a cosas como el Correo electrónico, donde hay de edición de texto de las celdas en cada fila. Y las tablas pueden ser fácilmente todos transparente, con sólo los botones o etiquetas visibles, por lo que no se parecen a las tablas.

Usted puede obtener una gran cantidad de kilometraje de la autoresizingMask de cada UIView. Si usted tiene uno o más elementos que puede tener una altura flexible, generalmente se puede obtener un diseño de la interfaz que se ve bien en cualquier orientación. Dependiendo de cómo se ve, a veces sólo puede clavija de todo, a la parte superior.

En casos raros, si todos los elementos de la interfaz de ajuste en una plaza, sólo se puede girar en su lugar.

Hay dos momentos en los que deben gestionar de forma explícita los cambios de orientación. Uno es cuando la vista se mueve de lado a debajo de otro en la rotación. La otra es cuando tiene imágenes diferentes para cada orientación, por ejemplo, si usted quiere estar siempre lleno de ancho.

A veces hay formas de evitar tanto de estos. Usted podría utilizar estirable imágenes o se limite a una vista por línea. O usted puede bloquear la orientación de ciertos puntos de vista.

Si debe cambiar el diseño de las vistas, hay un explícito layoutSubviews método. Usted debe tratar de manejar a todos que usted condicional de diseño en este método. Es sólo cuando la opinión de los límites de cambio, por ejemplo en la rotación o si usted tiene un espacio para el teclado. Hacer una vista personalizada para cada vista de la jerarquía que debe responder a la rotación, y el diseño de la subvistas a partir de ahí.

2voto

Winder Puntos 1257

El SDK del iPhone está construido alrededor de una arquitectura MVC, así que en teoría si mantienes toda tu lógica (modelo) separada de la interfaz de usuario (vista) a continuación, sólo tiene que preocuparse acerca de la interfaz de usuario en un solo lugar: su visión de los controladores. Para aquellos, usted podría tener una vista separada de controlador para cada orientación, cada uno de los cuales sería, a continuación, sólo se puede cargar con un if/else para elegir que ver controlador de carga.

La misma idea es para iPhone / iPad de apoyo, donde se puede cargar otro controlador de vista de lo que puede manejar grandes pantallas.

1voto

symadept Puntos 16

Consulte el siguiente enlace: http://mustafashaik.wordpress.com/2010/11/17/handling-orientations-in-ipad/

0voto

johndpope Puntos 1485

Yo no puedo responder por este código, y con toda honestidad por encima de la willRotateToInterfaceOrientation de las grandes obras. Aquí otra toma en ella con FBDialog.m de Facebook para iphone / ipad. (aunque, creo que esto era para un webview)

aquí está la esencia

[[NSNotificationCenter defaultCenter] addObserver:self
  selector:@selector(deviceOrientationDidChange:)
  name:@"UIDeviceOrientationDidChangeNotification" object:nil];


- (void)deviceOrientationDidChange:(void*)object {
  UIDeviceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
  if ([self shouldRotateToOrientation:orientation]) {


    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    [self sizeToFitOrientation:YES];
    [UIView commitAnimations];
  }
}


-(CGAffineTransform)transformForOrientation {
  UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
  if (orientation == UIInterfaceOrientationLandscapeLeft) {
    return CGAffineTransformMakeRotation(M_PI*1.5);
  } else if (orientation == UIInterfaceOrientationLandscapeRight) {
    return CGAffineTransformMakeRotation(M_PI/2);
  } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
    return CGAffineTransformMakeRotation(-M_PI);
  } else {
    return CGAffineTransformIdentity;
  }
}

- (void)sizeToFitOrientation:(BOOL)transform {
  if (transform) {
    self.transform = CGAffineTransformIdentity;
  }

  CGRect frame = [UIScreen mainScreen].applicationFrame;
  CGPoint center = CGPointMake(
    frame.origin.x + ceil(frame.size.width/2),
    frame.origin.y + ceil(frame.size.height/2));

  CGFloat scale_factor = 1.0f;
  if (FBIsDeviceIPad()) {
    // On the iPad the dialog's dimensions should only be 60% of the screen's
    scale_factor = 0.6f;
  }

  CGFloat width = floor(scale_factor * frame.size.width) - kPadding * 2;
  CGFloat height = floor(scale_factor * frame.size.height) - kPadding * 2;

  _orientation = [UIApplication sharedApplication].statusBarOrientation;
  if (UIInterfaceOrientationIsLandscape(_orientation)) {
    self.frame = CGRectMake(kPadding, kPadding, height, width);
  } else {
    self.frame = CGRectMake(kPadding, kPadding, width, height);
  }
  self.center = center;

  if (transform) {
    self.transform = [self transformForOrientation];
  }
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X