tema

2010-07-09 28 views
7
aplicación

Mi iPhone cambio de orientación del iPad está mostrando un comportamiento extraño cuando se ejecuta en el IPAD en relación con el apoyo a los cambios de orientación.tema

La aplicación se inicia con un controlador de vista (llámelo vista A por el argumento) y controlador de navegación, y shouldAutorotateToInterfaceOrientation está devolviendo SÍ solo para retrato. En el controlador de navegación, presiono un controlador de vista (vista B) que también devuelve SÍ solo para retrato. Luego, presiono otro controlador de vista (vista C) en el controlador de navegación que admite todas las rotaciones y ajusta los elementos en la pantalla en función de la orientación para girar.

Cuando esto se ejecuta en el simulador y dispositivo de iPhone, si gira al paisaje en la vista C y luego toca el botón Atrás para volver a ver B, hace lo correcto y cambia la vista B al modo vertical. (En el simulador, incluso gira el simulador de nuevo a retrato automágicamente.)

El problema que estoy experimentando es que, cuando hago esta misma secuencia de eventos en el simulador y dispositivo del iPad, la vista B que aparece es no girada de nuevo a retrato, y el controlador de navegación aún muestra la información para la vista C. Luego, toco el botón Atrás, y la vista permanece igual pero el controlador de navegación muestra normal para la vista B (pero todo sigue en modo paisaje) . Luego, si vuelvo a presionar el botón Atrás, aparece la vista A debajo de los artículos de la barra de navegación B y, finalmente, al tocar nuevamente, aparece la vista A con los elementos de la barra de navegación A.

Si voy a ver B en el iPad y empiezo a rotar, shouldAutorotateToInterfaceOrientation se dispara con NO hasta que llego al modo vertical, y luego todo vuelve a la normalidad.

La aplicación está siendo desarrollada con la última versión del SDK de iPhone, y tiene las siguientes configuraciones de compilación: Base SDK de iPhone Simulator 4.0, familia de dispositivos dirigidos de iPhone, implementación de iPhone OS Objetivo de iPhone OS 3.1.3.

¿Alguna idea?

+0

que tienen exactamente el mismo problema aquí, y creo que es un error en iOS3.2. En mis iPhones (3.1.2 y 4.0) todo como debería ser. Lamentablemente, no hay función (documentada) para cambiar manualmente la orientación. Veamos lo que otros tienen que decir aquí ... – cocoapriest

Respuesta

4

estados de Apple:

Case: All child view controllers in your UITabBarController or UINavigationController do not agree on a common orientation set.

Response: To make sure that all your child view controllers rotate correctly, you must implement shouldAutorotateToInterfaceOrientation for each view controller representing each tab or navigation level. Each must agree on the same orientation for that rotate to occur. That is, they all should return YES for the same orientation positions.

http://developer.apple.com/iphone/library/qa/qa2010/qa1688.html

Usted puede ser capaz de ajustar la orientación del dispositivo en el controlador de navegación en lugar de dentro de puntos de vista individuales. Luego, podría verificar qué vista está en la pila y rotar en función del resultado. De esta forma, el controlador de navegación maneja todas las orientaciones también.

+0

ese no es el problema. por favor lea la pregunta cuidadosamente. Hay una diferencia real entre iPhone y iPad, cómo manejan este problema ... – cocoapriest

+0

Entiendo el problema, solo estaba pasando la guía de Apple :) Si crees que es un error en el simulador, debes archivar un radar con Apple al respecto.Mucha gente usa los controladores de navegación con orientación, pero parece que no puedo encontrar ninguna información sobre otros que tienen este mismo problema a pesar de que 3.2 ha estado fuera por mucho tiempo. – iwasrobbed

+2

Creo que esto se aplica a su caso. Su vista C admite todas las orientaciones, mientras que A y B solo admiten retrato. El QA1688 de Apple dice que todos los controladores de vista secundarios bajo un UINavigationController tienen que acordar un conjunto de orientaciones de comentarios. Tuve el mismo problema (no estoy de acuerdo con las orientaciones) en [esta pregunta] (http://stackoverflow.com/questions/3086684). – progrmr

0

Aquí hay un código que estoy usando para evitar que el error:

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(M_PI/2); 
     self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 
    } 
    [UIView commitAnimations]; 
} 

y

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(-(M_PI/2)); 
     self.view.bounds = CGRectMake(0, 0, 320, 480);; 
    } 
    [UIView commitAnimations]; 
} 

Sobre la base de lo que la orientación del dispositivo se encuentra, tendrá que modificar algunos de los códigos .

+0

¿Por qué establecer la transformación dos veces? – progrmr

+0

El primero establece el tipo de transformación (identidad) y el segundo realiza la transformación. También shouldAutoRotateToInterfaceOrientation dice rotar si el dispositivo está en esa orientación. Si el dispositivo está en horizontal, la interfaz no girará a menos que esté en vertical. El código que envié es para iPhone (320 y 480), pero si la orientación del dispositivo es lanscape, la vista parecerá que está en vertical, lo que hará que el usuario incline el dispositivo para colocarlo en vertical (viceversa). –

+0

Acepto con progrmr: no debería necesitar asignar la propiedad de transformación dos veces. La primera tarea simplemente será ignorada ya que no estás haciendo nada con ella. 'CGAffineTransformMakeRotation' no devuelve nada más que una rotación que significa una transformación de identidad con una rotación añadida. –