2008-08-02 18 views
88

Nota: esta pregunta es de 2008 y ahora tiene un interés histórico.Aplicación de iPhone en modo apaisado, 2008 sistemas


Cuál es la mejor manera de crear una aplicación de iPhone que se ejecuta en modo horizontal desde el principio, independientemente de la posición del dispositivo?

Tanto de forma programática como con el Generador de interfaces.

+5

Para futuros lectores, tenga en cuenta que este famoso problema ** ahora es SOLUCIONADO por Apple ** a partir de 2011. Observe el proyecto de prueba en la respuesta a continuación. – Fattie

Respuesta

46

Respuesta histórica solamente. Espectacularmente desactualizado:

Tenga en cuenta que esta respuesta está muy desactualizada.

Este mensaje es solamente una curiosidad histórica.


¡Buenas noticias! Como descubrió Andrew a continuación, este problema ha sido resuelto por Apple en 4.0+.

Parece que ya no es necesario forzar el tamaño de la vista en cada vista, y se ha resuelto el grave problema específico del paisaje "que solo funciona la primera vez".

A partir de abril de 2011, no es posible probar o incluso construir nada por debajo de 4.0, por lo que la pregunta es puramente una curiosidad histórica. ¡Es increíble cuántos problemas causó a los desarrolladores durante tanto tiempo!


Aquí está la discusión original y la solución. Esto es totalmente irrelevante ahora, ya que estos sistemas ni siquiera son operables.


es extremadamente difícil de hacer este trabajo totalmente - hay por lo menos tres problemas/errores en el juego.

probar este .. interface builder landscape design

nota en particular de que donde dice "y hay que utilizar shouldAutorotateToInterfaceOrientation adecuadamente en todas partes" que significa en todas partes, todos sus puntos de vista a pantalla completa.

Espero que ayude en esta pesadilla!

un recordatorio importante de la ADICIONAL conocido problema que nos ocupa aquí: si usted está tratando de cambiar entre MÁS DE UN vista (todo el paisaje), TI simplemente no funciona. Es esencial recordar esto o perderá días en el problema. Literalmente NO ES POSIBLE. Es el error abierto, conocido y más grande en la plataforma de iOS. Literalmente, no hay forma de que el hardware haga que la segunda vista que cargue sea horizontal. La solución molesta pero simple, y lo que debe hacer, es tener un UIViewController maestro trivial que no haga nada más que sentarse allí y le permita intercambiar sus puntos de vista.

En otras palabras, en iOS debido a un fallo importante saber:

[window addSubview:happyThing.view]; 
[window makeKeyAndVisible]; 

Usted puede hacer que sólo una vez. Más tarde, si intenta eliminar happyThing.view, y en su lugar pone newThing.view, NO FUNCIONA, Y ES DE ESO.La máquina nunca girará la vista hacia el paisaje. No hay ningún truco, incluso Apple no puede hacer que funcione. La solución que debe adoptar es tener un UIViewController general que simplemente se encuentre allí y solo contenga sus diversas vistas (happyThing, newThing, etc.). ¡Espero eso ayude!

+2

Creo que esto se ha solucionado en 4.x. Enviamos un juego que tenía varias pantallas diferentes, algunos paisajes y algunos retratos, y simplemente no funcionó en 3.x. No queriendo entrar en la vista ficticia adicional para manejarlo, en su lugar requerimos 4.x, que, un año después de que se hizo esta pregunta, probablemente esté bien. – AndrewS

+0

No hicimos "siempre paisaje" sino más bien paisaje o retrato. Cada VC se agrega y elimina directamente de la ventana. La aplicación inicia paisaje, se mantiene de esa manera a través de varias transiciones de pantalla. No utilizamos una vista ficticia, pero anulamos shouldAutorotate en cada pantalla. No hay problemas en 4.x, desde el tacto al teclado al teléfono. – AndrewS

40

Desde el sitio de Apple Dev:

para iniciar la aplicación en el paisaje modo de modo que la barra de estado se encuentra en la posición adecuada inmediato, edite su archivo Info.plist para agregar la clave UIInterfaceOrientation con la valor apropiado (UIInterfaceOrientationLandscapeRight o UIInterfaceOrientationLandscapeLeft), como se muestra en el Listado 2.

Listado 2: A partir de su aplicación en modo horizontal

<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeRight</string> 
+5

Esto más en su método de orientación de los métodos de autorización de toTaraAutorizar (interfaceOrientation! = UIInterfaceOrientationPortrait); y tu estas listo. – mbehan

+5

La pregunta pregunta cómo iniciar el dispositivo en modo horizontal. Las respuestas dan esa información. El manejo de la orientación después de eso no se menciona en la pregunta. +1 Michael Pryor –

+1

¡Curiosamente, la "respuesta" de hecho NO arrancará el dispositivo en modo horizontal - !! Es probablemente el error/dificultad más famoso en todo el entorno de Apple. ¡Es básico para un desarrollador de iPad muy trabajador! – Fattie

6

de SASB y la respuesta de michaelpryor parece ser correcta, pero si no está trabajando para usted, trate de esta alternativa:

- (void)applicationDidFinishLaunchingUIApplication *)application { 
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight; 
} 

O éste:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]; 

O esta otra:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO]; 

Primero, también debe llamar al window makeKeyAndVisible;.

Unos enlaces: Developing in landscape mode, iPhone SDK: How to force Landscape mode only?

@ Robert: consulte The iPhone SDK, NDA, and Stack Overflow.

4

La última guía de programación de SO del iPhone contiene una sección completa al respecto, con código de ejemplo. Estoy seguro de que esta es una adición reciente, así que quizás te lo perdiste. Explica todas las condiciones que debe cumplir; básicamente ...

  • establezca las propiedades Info.plist (esto cambia la posición de la barra de estado, pero no la vista)
  • girar la vista manualmente alrededor de su centro, en cualquiera de sus UIViewController viewDidLoad: método o su applicationDidFinishLaunching: método o implementar la rotación automática ("comportamientos de tamaño automático", página 124)

buscar "Lanzamiento en modo horizontal", página 102.

7

primero establecido en información.plist

<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeRight</string> 

entonces puse este código en applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633); 
[window setTransform:rotate]; 

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

De esta manera puedo trabajar en la vista en Interface Builder en modo horizontal.

27

Resumen e integración de todas las publicaciones, después de probarlo yo mismo; verifique la actualización de 4.x, 5.x a continuación.

A partir de 3.2 no puede cambiar la orientación de una aplicación en ejecución desde el código.

Pero puede iniciar una aplicación con una orientación fija, aunque hacerlo no es sencillo.

intento con esta receta:

  1. configurar la orientación a UISupportedInterfaceOrientations en el archivo Info.plist
  2. en la ventana de definir un "controlador de vista base" 480x320. Cada otra vista se agregará como una subvista a su vista.
  3. en todos los controladores de vista establecido el método shouldAutorotateToInterfaceOrientation: (para devolver el mismo valor que ha definido en el plist, por supuesto)
  4. en todos los controladores de vista establecidos a fin de fondo con

    self.view.frame = CGRectMake(0, 0, 480, 320)

    en el método viewDidLoad.

Update (iOS 4.x, 5.x): la Guía de programación de aplicaciones de Apple iOS tiene un "Lanzamiento en modo horizontal" en el apartado "trucos Advanced App" capítulo.

Referencias:

+1

Puedo confirmar que esta es la única solución que realmente funciona (con una pequeña adición). Me tomó horas encontrarlo y evaluarlo. Todas las otras respuestas son solo soluciones parciales al problema. –

+0

Me encanta cómo el enlace a la pregunta SO vincula de nuevo a esta pregunta. –

+0

Ty Richard, se ha eliminado el enlace de bucle – IlDan

5

Me sorprende que nadie ha llegado con esta respuesta todavía:

En todas mis pruebas cuando un despido de un modal Controlador de vista La orientación preferida del controlador de vista principal establecida en shouldAutorotateToInterfaceOrientation se respeta incluso cuando forma parte de un UINavi gationController. La solución a esto es simple:

Crea un UIViewController ficticio con un UIImageView para un fondo. Establezca la imagen en la imagen predeterminada.png que su aplicación usa al inicio.

Cuando se llama a viewWillAppear en su controlador de vista raíz, simplemente presente el controlador de vista ficticia sin animación.

cuando se llama a viewDidAppear en su controlador de vista ficticia, cierre el controlador de vista con una bonita animación de disolver cruzada.

¡Esto no solo funciona, sino que se ve bien!Por cierto, sólo para aclarar lo hago de viewWillAppear el controlador de vista raíz de esta manera:

- (void)viewWillAppear:(BOOL)animated 
{ 
if (dummy != nil) { 
    [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; 
    [self presentModalViewController:dummy animated:NO]; 
    [dummy release]; 
    dummy = nil; 
} 
... 
} 
3

Ver esta respuesta: Landscape Mode ONLY for iPhone or iPad

  1. añadir la orientación a PLIST
  2. shouldAutorotateToInterfaceOrientation = SI en todos los archivos

Aunque si está utilizando modos mixtos, es posible que esté mejor con

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]; 
Cuestiones relacionadas