2010-10-19 12 views
8

Esto es solo una aplicación de prueba, solo hay una clase AppDelegate para crear todo lo que hice fue crear una aplicación basada en Windows, establecer las orientaciones admitidas solo en el paisaje en info.plist , y luego añadir el siguiente código:Altura y ancho en iPhone (/ iPad)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; 

// Override point for customization after application launch. 
UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"hu" message:@"hui" delegate:nil cancelButtonTitle:@"hi" otherButtonTitles:nil]; 
[test show]; 
[window makeKeyAndVisible]; 
    NSLog(@"win %f - %f", window.bounds.size.width, window.bounds.size.height); 
return YES; 
} 

Sin la primera línea, que establece la orientación barra de estado, la vista alerta aparece en el retrato a pesar de que el resto de la interfaz está en la izquierda paisaje.

De todos modos el registro todavía da esto:

win 768.000000 - 1024.000000 

Esto es al revés (y por lo tanto cuando agrego subvistas en mi verdadera aplicación de los marcos no son correctos)

de Apple parece tener realmente Perdido en la rotación de la interfaz, porque no he tenido más que problemas, no recuerdo que esto ocurra en el iPhone, así que por favor alguien me puede decir cómo solucionarlo.

Haré 500 de reputación (eso es todo menos 10 de mi reputación) a la persona que al menos puede explicar por qué sucede esto y espero brindarle una solución.

+0

¿Qué versión de SDK estás utilizando? – ImHuntingWabbits

+0

¿Por qué estás haciendo eso en AppDelegate? Para evitar esto, creo un BOOL en el AppDelegate que es False hasta que se llame a ese método donde cambie a TRUE. Luego, en viewWillLoad en mi MainVC, inicio un temporizador que comprueba si AppDelegate BOOL es TRUE. Si es así, enciendo el método que muestra la alerta. Para que se vea mejor, también muestro la imagen predeterminada en mi MainVC hasta que aparezca el mensaje. Esto puede parecer un enfoque raro, pero no siempre tengo que mostrar la vista de alerta, así que también lo compruebo. –

Respuesta

17

creo que el "Launching in Landscape Mode" del iOS Application Programming Guide explica sobre todo lo que está sucediendo con la aplicación de prueba:

aplicaciones en iOS normalmente lanzamiento en modo vertical para que coincida con la orientación de la pantalla de inicio. Si usted tiene una aplicación que se ejecuta en los modos vertical y horizontal , su aplicación siempre debe iniciar en modo vertical inicialmente y luego dejar que sus controladores de vista rotar la interfaz como sea necesario basándose en la orientación del dispositivo . Si la aplicación se ejecuta en modo horizontal solamente, sin embargo, que debe realizar los siguientes pasos para hacer que lanzar en una orientación horizontal inicialmente:

  • En Info.plist archivo de la aplicación, añadir el UIInterfaceOrientation key y establecen su valor en el modo horizontal. Para las orientaciones del paisaje, puede establecer el valor de esta clave en UIInterfaceOrientationLandscapeLeft o UIInterfaceOrientationLandscapeRight.

  • Exponga sus puntos de vista en el modo horizontal y asegúrese de que las opciones de conversión automática estén configuradas correctamente.

  • Sobreescribir shouldAutorotateToInterfaceOrientation de su controlador de vista: Método y volver SÍ sólo para la orientación horizontal deseada y NO para la orientación vertical.

Importante: los pasos anteriores asumen su aplicación utiliza los controladores de vista para gestionar su jerarquía de vistas. Los controladores de vista proporcionan una cantidad significativa de infraestructura para controlar cambios de orientación , así como otros eventos relacionados con la vista complejos. Si su aplicación no está utilizando vista controladores, como puede ser el caso de juegos y otras basados ​​ES OpenGL aplicaciones usted es responsable de rotación de la superficie de dibujo (o el ajuste de sus comandos de dibujo) como necesaria para presentar su contenido en modo paisaje.

En términos de su aplicación de prueba, la parte clave es la última sección. No tiene un controlador de vista, por lo que es totalmente responsable de configurar la interfaz de usuario en la orientación que desee. Es por eso que debe establecer la orientación de la barra de estado manualmente.

He leído el primer párrafo que dice que las aplicaciones iOS siempre se inician en modo vertical y luego el controlador de vista raíz gira su vista para que coincida con la orientación del dispositivo inmediatamente y sin animación una vez que se agrega a la ventana. Eso significa que la ventana UI misma no gira, por lo que sus dimensiones siempre serán en términos de una orientación vertical (como ha dicho tadej5553).Además, los marcos de todas las subvistas de UIWindow también estarán en términos de una orientación vertical (ya que el marco siempre se define en las coordenadas de la vista principal). Por lo tanto, no importa cómo gire el dispositivo, el marco del controlador de vista raíz siempre estará en términos de una orientación vertical. Sin embargo, dado que la propiedad de límites de una vista se define en términos de sus propias coordenadas, esa altura y ancho deben reflejar la orientación actual de la vista.

No está claro lo que intenta lograr con su aplicación real, pero la práctica recomendada es establecer sus vistas para la orientación vertical y luego configurar sus propiedades de autoevaluación para manejar la rotación automática (si ocurre inmediatamente después de la aplicación) lanzamiento o más tarde).

+0

Muy buena respuesta, así que la aceptaré y comenzaré otra recompensa (no de 500: \\) cuando pueda y se la adjudicaré, sin embargo, personalmente prefiero la respuesta de Deniz para que reciba la recompensa. Explicas bien por qué sucede en general, lo cual es realmente útil para mí y si pudiera dividir la recompensa ahora lo haría. –

+0

El iPad es una excepción a la regla porque su pantalla de inicio puede rotar al paisaje. – bentford

3

En lugar de interferir manualmente con la barra de estado, intente establecer UISupportedInterfaceOrientations en UIInterfaceOrientationLandscapeLeft en su archivo info.plist. Luego, la aplicación debe estar configurada para ejecutarse una vez que la inicie.

La configuración manual de la barra de estado es similar a "nivel bajo". Los controladores de vista también deben devolver UIInterfaceOrientationLandscapeLeft en el método de instancia shouldAutorotateToInterfaceOrientation.

+0

Por favor, lea mi pregunta :) usted pensaría que lo que sugiere funcionaría, pero no es así. –

+0

duh lo siento por eso – Nimrod

+0

¿Por qué no tienes UIViews? Siempre se supone que debes tener un contenedor UIView dentro de tu ventana, hasta donde yo sé. No está colocando vistas de widgets directamente dentro de la ventana o algo así es usted? – Nimrod

4

La ventana siempre dará el tamaño para la orientación vertical. Siempre.

Pero las vistas en él darán las medidas correctas (con respecto a la orientación), así que asegúrese de usarlas.

+0

Acabo de hacer esto, y bien cambia la diferencia de la barra de estado (20 píxeles) correctamente, pero todavía no cambia el ancho y la altura. –

+0

El ancho sigue siendo como 768 cuando está en el paisaje (la altura de la pantalla en el paisaje es 1024) y viceversa en el retrato –

+0

usa los límites, no el marco de la vista para obtener las coordenadas correctas – tadejsv

10

UIWindow no sabe nada acerca de la rotación. Los métodos de rotación están encapsulados en UIViewController. (auto rotaciones, etc.)

UIAlertView utiliza la propiedad statusBarOrientation de UIApplication para elegir la orientación de la alerta.

// Rotate to a specific orientation. This only rotates the status bar and updates the statusBarOrientation property. 
// This does not change automatically if the device changes orientation. 
@property(nonatomic) UIInterfaceOrientation statusBarOrientation; 

Como puede ver en los encabezados del SDK, el estadoBarOrientation no cambia automáticamente. Entonces usted o UIViewController (rotación automática) deberían cambiar esta propiedad.

Si se inicia el retrato (lo cual es consistente con la orientación predeterminada de UIWindow), y utiliza shouldAutorotateToInterfaceOrientation y dejar que UIViewController manejar la rotación, cambia statusBarOrientation de UIApplication en cada cambio de la orientación del dispositivo.

Pero si comienza en modo apaisado, debe establecer manualmente statusBarOrientation por una vez.

Espero que esto ayude.

+1

Gracias por explicar los términos de UIAlertView y diciendo lo que debería hacer. –

+0

He pasado tanto tiempo tratando de resolver esto antes de encontrar esta solución. Poniendo [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animada: NO]; como la primera línea de mi loadView hizo el trabajo. ¡Gracias! – Andy

+0

Creo que acabo de perder 2 horas intentando que mi aplicación para iPad (iOS5) comience solo en el paisaje. Esto funciona, muchas gracias. – Jasper

6

Use los bordes de la vista

3

Aquí está lo que hice para conseguir que esto funcione:

  • En el Info.plist, asegúrese de tener estos parámetros:
    • interfaz inicial orientación = Horizontal (botón de inicio a la derecha)
    • Orientaciones de interfaz admitidas
      • Artículo 0 = Paisaje (derecha botón de inicio)
      • artículo 1 = Horizontal (botón de inicio a la izquierda)
  • Añadir un controlador de vista basado xib, con el fin de que maneja el tamaño de vehículos (eliminan el problema de cambio de tamaño, etc.)
    • Nota Utilicé un controlador de navegación aquí con un controlador de vista porque es lo que tenía a mano, pero creo que esto debería funcionar también con un único controlador virtual.

Añadir un poco de código a su delegado de la aplicación:

_rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
_navigationController = [[UINavigationController alloc] initWithRootViewController:self.launcherViewController]; 
[window addSubview:self.navigationController.view]; //I think this is the key. 
[window makeKeyAndVisible]; 

Creo que la clave es la vista, lo probé sin él y en el iPhone ha funcionado bien, en el iPad aunque la alerta apareció en modo retrato como dices. Cuando agregué la vista, volví a mostrar la alerta en modo apaisado como lo deseaba.

0

No he tenido más que problemas al codificar mi aplicación en el modo de solo paisaje. Gran parte del tiempo no hubo problemas visuales, pero los botones en los 20 píxeles inferiores no se pudieron seleccionar. Hice un clipToBounds en mi ventana UI principal y agregué un borde en su capa y pude ver que la ventana UI estaba debajo de la barra de estado. Traté de cambiar mi desplazamiento x de mi ventana UI a 20 (UIWindow aún está en Portrait, su contenido es Landscape) pero esto significaba que mis UIControllers se desplazaron 20 píxeles hacia abajo (No estoy seguro por qué). Aunque este es un problema diferente al suyo, también encontré el mismo problema que tiene, ya que los límites y los marcos cuando se imprimen parecen ser correctos.

De todas formas para cortar una larga historia corta cambié plist de UIInterfaceOrientationLandscapeLeft a UIInterfaceOrientationLandscapeRight y también cambió mi método UIViewController a:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

Y todos mis problemas desaparecieron. Muchas veces he jurado que hay errores en el código de rotación de Apple que resultan ser la forma en que he implementado algo, pero creo que este es definitivamente uno de Apple.

Avísame si esto soluciona tu problema

Cuestiones relacionadas