2010-04-21 6 views
38

En mi aplicación de sistema operativo de iPhone, quiero (necesito) observar cambios en la orientación del dispositivo para 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 desde allí calcular el tamaño y/o el posicionamiento de otros controles (también intenté self.view.frame).Tamaño de fotograma/ventana "incorrecto" después de la reorientación en iPhone

Todas las pruebas se realizaron hasta el momento en modo vertical, por lo que pude centrarme en la programación de las funciones principales y más tarde solo hacer algunos ajustes para Horizontal. Y aquí entra el problema: en -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation agregué algunos registros para verificar los tamaños antes de continuar, pero aparentemente los valores de Ancho y Alto son "incorrectos" (digo "incorrecto" porque a primera vista los valores no tienen sentido para mí)

Aquí está la salida de algunos de registro:

  • Rotación: paisaje [w = 300,000000, h = 480.000000]
  • Rotación: Retrato [w = 320,000000, h = 460.000000]

Los valores para "w" y "h" en Landscape parecen invertidos para mí, esperaba w = 480 yh = 300.

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

-(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]); 
} 
+0

hhmm ... si uso 'self.view.bounds' (teniendo en cuenta que" self.view "es la vista principal principal, donde se agregan otras subvistas para componer la aplicación) obtengo los valores esperados. Ahora me sale este comportamiento Recuerdo algo de lo que hablaron en el curso Standford iPhone Dev en iTues U, pero no estoy seguro de si está relacionado. De todos modos, todavía me gustaría tener una opinión más concreta. –

+0

También, curiosamente, 'self.view.frame' funciona bien si tiene un controlador de navegación, pero si no lo hace, parece que tiene que usar' self.view.bounds'. – Rob

Respuesta

33

La orientación de su dispositivo cambió, no las características físicas de la pantalla. Básicamente lo inclinas hacia un lado, pero en realidad tiene 320 píxeles de ancho (20 de los cuales no están disponibles en este momento desde que se muestra la barra de estado) y 480 píxeles de alto. Si su vista gira automáticamente, entonces el ancho/alto ha sido traducido para usted, pero cuando solicita las dimensiones reales de la pantalla, recupera las dimensiones reales de la pantalla.

Esta es también la razón por la cual, 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.

+4

¿La vista traducida (mediante giro automático) no afecta el marco de la vista? ¿Puedes explicar más o sabes que el enlace relacionó este principio? estoy confundido. gracias por adelantado. – user1705636

18

He estado tropezando con el mismo problema y con un poco de trabajo de diagnóstico descubrí que los límites y el marco de la vista no reflejan exactamente la orientación horizontal en viewDidLoad (cuando el dispositivo se mantiene en horizontal cuando se empuja el controlador de vista la pila), pero hazlo 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.

+0

Tengo un código de trabajo que resuelve esto aquí: [¿Cómo obtener la altura y el ancho dependientes de la orientación de la pantalla?] (Http: // stackoverflow.com/questions/7905432/how-to-get-orientation-dependent-height-and-width-of-the-screen/7905540 # 7905540). Tal vez haya pasado algún problema con esto, pero si no, espero que ayude. – Sam

27

Use self.view.bounds en su lugar.

+0

Cuidado con esto. Es genial si el tamaño de la vista actual es lo que realmente desea, pero no es un sustituto de [UIScreen mainScreen] .applicationFrame porque no toma en cuenta la altura de la barra de estado. – Axeva

+0

Sigue teniendo el valor equivocado. el ancho y el alto son incorrectos. Debe ser volteado. – openfrog

+0

Esto funcionó para mí en iOS 7, me dio el nuevo tamaño correcto en willAnimateRotationToInterfaceOrientation. – malhal

Cuestiones relacionadas