Pregunta

Nota:Esta pregunta es de 2008 y ahora sólo tiene interés histórico.


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

Tanto mediante programación como utilizando Interface Builder.

¿Fue útil?

Solución

Sólo respuesta histórica.Espectacularmente desactualizado:

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

Esta publicación es solo una curiosidad historica.


¡Noticias emocionantes!Como descubrió Andrew a continuación, Apple solucionó este problema en 4.0+.

Parecería 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 "sólo funciona la primera vez".

En abril de 2011, no es posible probar ni siquiera 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 y la solución originales.Esto es totalmente irrelevante ahora, ya que estos sistemas ni siquiera son operativos.


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

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

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

¡Espero que te ayude en esta pesadilla!

Un recordatorio importante del conocido problema ADICIONAL que nos ocupa aquí:si estás intentando intercambiar entre MÁS DE UNO vista (todo paisaje), SIMPLEMENTE NO FUNCIONA.Es fundamental recordar esto o perderás días con 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 carga sea horizontal.La solución molesta pero simple, y lo que debes hacer, es tener un UIViewController maestro trivial que no haga más que quedarse ahí y permitirte intercambiar entre tus vistas.

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

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

Puedes hacer eso solo una vez.Más tarde, si intenta eliminar happyThing.view y, en su lugar, coloca newThing.view, NO FUNCIONA, Y ESTO ES TODO.La máquina nunca girará la vista al paisaje.No existe ningún truco, ni siquiera Apple puede hacerlo funcionar.La solución alternativa que debe adoptar es tener un UIViewController general que simplemente se encuentre allí y contenga sus diversas vistas (happyThing, newThing, etc.).¡Espero eso ayude!

Otros consejos

Desde el sitio de desarrollo de Apple:

Para iniciar su aplicación en modo de paisaje para que la barra de estado esté en la posición apropiada de inmediato, edite su archivo Info.plist para agregar la tecla UIinterFaceorientation con el valor apropiado (uiinterfaceorientationlandscaperight o uiinterfaceorientationscapeleft), como se muestra en el Listado 2.

Listado 2:Comenzar su aplicación en modo de paisaje

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

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

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

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

Prueba con esta receta:

  1. establezca su orientación en UISupportedInterfaceOrientations en el Info.plist archivo
  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 definiste en el plist, por supuesto)
  4. en todos los controladores de vista, establezca una vista de fondo con

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

    en el viewDidLoad método.

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

Referencias:

Primero lo 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.

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

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

O este:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

O este:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Es posible que también tengas que llamar window makeKeyAndVisible; primero.

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

@Roberto:por favor refiérase a El iPhone SDK, NDA y Stack Overflow.

Me sorprende que a nadie se le haya ocurrido esta respuesta todavía:

En todas mis pruebas, cuando descarto un controlador de vista modal, la orientación preferida del controlador de vista principal se establece en shouldAutorotateToInterfaceOrientation se respeta 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 usa su aplicación al inicio.

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

cuando viewDidAppear se llama en su controlador de vista ficticio, descarte el controlador de vista con una agradable animación de disolución cruzada.

¡Esto no solo funciona, sino que se ve bien!Por cierto, solo para aclarar, hago el controlador de vista raíz viewWillAppear como esto:

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

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 tal vez te la perdiste.Te explica todas las condiciones que tienes que cumplir;básicamente...

  • establezca las propiedades de Info.plist (esto cambia la posición de la barra de estado, pero no la vista)
  • gire su vista manualmente alrededor de su centro, ya sea en su UIViewController viewDidLoad:método o su aplicaciónDidFinishLaunching:método o implementar la rotación automática ("Comportamientos de cambio de tamaño automático", página 124)

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

Vea esta respuesta: Modo horizontal SÓLO para iPhone o iPad

  1. agregar orientación a plist
  2. deberíaAutorotateToInterfaceOrientation = SÍ en todos los archivos

Aunque si estás usando modos mixtos, quizás sea mejor que utilices

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top