Tamaño de marco / ventana" incorrecto " después de la reorientación en el iPhone


En mi aplicación iPhone OS quiero (necesito) estar atento a los cambios en la orientación del dispositivo con el fin de reorganizar ciertas partes de la pantalla. El enfoque que utilicé fue usar CGRect frame = [UIScreen mainScreen].applicationFrame para obtener el tamaño de la pantalla, y a partir de ahí calcular el tamaño y / o posicionamiento de otros controles (también intenté self.view.frame).

Todas las pruebas se realizaron hasta ahora en modo Vertical, por lo que pude centrarme en la programación de las características principales y luego solo hacer algunos ajustes para Horizontal. Y aquí entra el problema: En -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation he añadido algunos registros para comprobar los tamaños antes de proceder, pero al parecer los valores de Anchura y Altura son "erróneos" (digo "erróneos" porque a primera vista los valores no tienen sentido para mí).

Aquí está la salida de algunos registros:

  • Rotación: Horizontal [w=300.000000, h=480.000000]
  • Rotación: Retrato [w=320.000000, h=460.000000]

Los valores de" w "y" h " en Paisaje me parecen invertidos-esperaba que w = 480 y h = 300.

¿Qué estoy haciendo mal? El código que utilicé para depurar está a continuación.

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGSize size = frame.size;

    NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]",  
        UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape",
        size.width, size.height]);
}
Author: Rafael Steil, 2010-04-22

3 answers

La orientación de su dispositivo cambió, no las características físicas de la pantalla. Básicamente lo inclinaste de lado, pero en realidad tiene 320 píxeles de ancho (20 de los cuales no están disponibles en este momento ya que se muestra la barra de estado) y 480 píxeles de alto. Si su vista es auto-rotatoria, entonces el ancho/alto se han traducido para usted, pero cuando usted pide las dimensiones reales de la pantalla, usted obtiene las dimensiones reales de la pantalla.

Esta es también la razón, cuando se trabaja con vistas traducidas, es importante hacer cálculos basados en el centro de la vista y los límites de la vista y nunca en el marco de la vista.

 33
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-14 16:48:53

Use self.view.bounds en su lugar.

 27
Author: Mike Keskinov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 13:04:34

He estado tropezando con el mismo problema y con algunos trabajos de diagnóstico descubrí que los límites y el marco de la vista no reflejan con precisión la orientación horizontal en viewDidLoad (cuando el dispositivo se mantiene en horizontal cuando el controlador de vista se empuja sobre la pila), pero lo hacen correctamente en viewWillAppear: y viewDidAppear:. Acabo de mover mi código que necesitaba las dimensiones del marco/límites de viewDidLoad a viewWillAppear:, y funcionó correctamente.

 18
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-11 12:24:11