Aplicación de iPhone en modo horizontal, sistemas 2008

98

Tenga en cuenta que esta pregunta es de 2008 y ahora solo tiene un interés histórico.


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

Tanto mediante programación como mediante el Interface Builder.

Michiel de Mare
fuente
5
Para los futuros lectores, tenga en cuenta que este famoso problema ahora está RESUELTO por Apple a partir de 2011. Tenga en cuenta el proyecto de prueba en la respuesta a continuación.
Fattie

Respuestas:

47

Solo respuesta histórica. Espectacularmente desactualizado.

Tenga en cuenta que esta respuesta ahora está muy desactualizada /

Esta respuesta es solo una curiosidad histórica .


¡Noticias emocionantes! Como descubrió Andrew a continuación, este problema ha sido solucionado 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 "solo funciona la primera vez".

Desde 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 la cantidad de problemas que causó a los desarrolladores durante tanto tiempo!


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


Es EXTREMADAMENTE DIFÍCIL hacer que esto funcione completamente; hay al menos tres problemas / errores en juego.

prueba este ... diseño de paisaje del constructor de interfaces

Tenga en cuenta en particular que donde dice "y debe usar shouldAutorotateToInterfaceOrientation correctamente en todas partes" significa en todas partes, todas sus vistas de pantalla completa.

¡Espero que te ayude en esta pesadilla!

Un recordatorio importante del conocido problema ADICIONAL que nos ocupa aquí: si está intentando cambiar entre MÁS DE UNA vista (todo paisaje), SIMPLEMENTE NO FUNCIONA . Es fundamental recordar esto o perderá días en el problema. Literalmente NO ES POSIBLE. Es el error abierto más grande conocido en la plataforma iOS. Literalmente, no hay forma de hacer 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 hace nada más que sentarse allí y permitirle intercambiar sus puntos de vista.

En otras palabras, en iOS debido a un error de conocimiento importante:

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

Puedes hacerlo solo una vez . Más tarde, si intenta eliminar happyThing.view y, en su lugar, coloca newThing.view, NO FUNCIONA, Y ESO ES. La máquina nunca rotará la vista al paisaje. No hay solución de trucos, incluso Apple no puede hacer que funcione. La solución alternativa que debe adoptar es tener un UIViewController general que simplemente se sienta allí y solo mantenga sus diversas vistas (happyThing, newThing, etc.). ¡Espero eso ayude!

Fattie
fuente
2
Creo que esto se ha solucionado en 4.x. Enviamos un juego que tenía un montón de pantallas diferentes, algunas de paisaje y algunas de retrato, y simplemente no funcionaba 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
No hicimos "siempre paisaje", sino más bien varios paisajes o retratos. Cada VC se agrega y se elimina directamente de la ventana. La aplicación se inicia en horizontal, permanece así a través de varias transiciones de pantalla. No usamos una vista ficticia, pero SÍ anulamos shouldAutorotate en cada pantalla. No hay problemas en 4.x, del tacto al teclado y al teléfono.
AndrewS
41

Desde el sitio de desarrollo de Apple:

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

Listado 2: Iniciar su aplicación en modo horizontal

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Michael Pryor
fuente
5
Este plus en sus métodos shouldAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPortrait); y tu estas listo.
Michael Behan
5
La pregunta pregunta cómo iniciar el dispositivo en modo horizontal. Las respuestas dan esa información. La orientación de manejo después de eso no se menciona en la pregunta. +1 Michael Pryor
ingh.am
1
Curiosamente, la "respuesta" de hecho NO iniciará el dispositivo en modo horizontal - !! Probablemente sea el error / dificultad más famoso de todo el entorno de Apple. ¡Es básico para desarrolladores de iPad que trabajan mucho!
Fattie
@mbehan También hay UIInterfaceOrientationPortraitUpsideDown, por lo que no es una solución. Además, UIInterfaceOrientation en .plist solo es compatible con 3.2+, no en dispositivos 3.1.3 y anteriores (y recuerde que el iPhone 2G está bloqueado en esa versión).
Ivan Vučica
28

Resumen e integración de todas las publicaciones, después de probarlo yo mismo; compruebe la actualización para 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.

Prueba con esta receta:

  1. establece tu orientación UISupportedInterfaceOrientationsen el Info.plistarchivo
  2. en su ventana defina un "controlador de vista base" de 480x320. Todas las demás vistas se agregarán como una subvista a su vista.
  3. en todos los controladores de vista configure el shouldAutorotateToInterfaceOrientation:método (para devolver el mismo valor que definió en el plist, por supuesto)
  4. en todos los controladores de vista establecer una vista de fondo con

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

    en el viewDidLoadmétodo.

Actualización (iOS 4.x, 5.x) : la Guía de programación de la aplicación Apple iOS tiene un párrafo "Inicio en modo horizontal" en el capítulo "Trucos avanzados de la aplicación".

Referencias:

IlDan
fuente
1
Puedo confirmar que esta es la única solución que realmente funciona (con una pequeña adición). Me tomó horas encontrar y evaluar esto. Todas las demás respuestas son solo soluciones parciales al problema.
Johannes Rudolph
8

Primero configuro en info.plist

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

luego 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.

samvermette
fuente
7

La respuesta de sasb y michaelpryor parece ser correcta, pero si no le funciona, pruebe esta alternativa:

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

O este:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

O este:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

También puede que tenga que llamar window makeKeyAndVisible;primero.

Algunos enlaces: Desarrollo en modo horizontal , iPhone SDK: ¿Cómo forzar solo el modo horizontal ?

@Robert: consulte el iPhone SDK, NDA y Stack Overflow .

Sören Kuklau
fuente
6

Me sorprende que nadie haya encontrado esta respuesta todavía:

En todas mis pruebas, cuando se descarta un controlador de vista modal, se shouldAutorotateToInterfaceOrientationrespeta la orientación preferida del controlador de vista principal establecida incluso cuando forma parte de un UINavigationController. Entonces la solución a esto es simple:

Cree un UIViewController ficticio con un UIImageView como fondo. Establezca la imagen en la imagen default.png que su aplicación usa al inicio.

Cuando viewWillAppearreciba una llamada en su controlador de vista raíz, simplemente presente el controlador de vista ficticia sin animación.

cuando viewDidAppearreciba una llamada en su controlador de vista ficticio, cierre el controlador de vista con una bonita animación de disolución cruzada.

No solo funciona, ¡sino que se ve bien! Por cierto, solo para aclarar, hago el controlador de vista raíz viewWillAppearcomo este:

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

La última guía de programación de iPhone OS tiene una sección completa sobre esto, con código de muestra. Estoy seguro de que esta es una adición reciente, así que quizás te la perdiste. Explica todas las condiciones que debe cumplir; básicamente...

  • establecer las propiedades de Info.plist (esto cambia la posición de la barra de estado, pero no la vista)
  • rote su vista manualmente alrededor de su centro, ya sea en su método UIViewController viewDidLoad: o en su método applicationDidFinishLaunching: o implemente la rotación automática ("Comportamientos de autoresizing", página 124)

Busque "Inicio en modo horizontal", página 102.


fuente
4

Vea esta respuesta: Modo horizontal SOLO para iPhone o iPad

  1. agregar orientación a plist
  2. shouldAutorotateToInterfaceOrientation = YES en todos los archivos

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
nicc
fuente