2010-08-04 17 views
21

En mi aplicación para iPad, necesito ejecutar un código de diseño para establecer el diseño adecuado según la orientación. De forma predeterminada, el diseño está configurado para la orientación horizontal, por lo que, en el caso de que la aplicación se inicie en modo retrato, necesito tomar medidas adicionales para configurar las vistas correctamente para visualizarlas en vertical.Obtener la orientación de lanzamiento de la aplicación para iPad

En mi método -application:didFinishLaunchingWithOptions:, verifico la orientación usando [[UIDevice currentDevice] orientation]. El problema aquí es que siempre devuelve el retrato incluso si la aplicación está comenzando en el paisaje. ¿Hay alguna forma de evitar esto?

Respuesta

36

Se espera que esto suceda. Quoth the UIViewController documentation:

Nota: A la hora del lanzamiento, las aplicaciones siempre debe establecer su interfaz en una orientación vertical. Después de que el método application:didFinishLaunchingWithOptions: regrese, la aplicación usa el mecanismo de rotación del controlador de vista descrito anteriormente para rotar las vistas a la orientación adecuada antes de mostrar la ventana.

En otras palabras, por lo que el dispositivo se refiere a la orientación es retrato mientras la aplicación está poniendo en marcha. En algún momento después de application:didFinishLaunchingWithOptions:, detectará la orientación diferente y llamará a su método shouldAutorotateToInterfaceOrientation: y luego a su other view rotation methods, que debe manejar normalmente.

+0

para ayuda de batería o resultado rápido ver ..... este http://stackoverflow.com/questions/5888016/ios-device-orientation-on-load/32758397#32758397 – jenish

0

Usted quiere asegurarse de configurar las teclas adecuadas en su Info.plist para permitir las orientaciones que desee:

UISupportedInterfaceOrientations 
    UIInterfaceOrientationPortrait 
    UIInterfaceOrientationPortraitUpsideDown 
    UIInterfaceOrientationLandscapeLeft 
    UIInterfaceOrientationLandscapeRight 
+0

Tengo las 4 orientaciones en mi archivo plist. – indragie

13

Uso self.interfaceOrientation en su controlador de vista - que es una propiedad de UIViewController que se establece iOS para ti, y en algunos casos es más confiable que [[UIDevice currentDevice] orientation].

He aquí una descripción detallada: http://bynomial.com/blog/?p=25

+0

Buena solución, como esta. – Roger

+0

En realidad, hay tres propiedades de orientación: 'UIDevice.orientation',' UIViewController.interfaceOrientation', y 'UIApplication.statusBarOrientation'. – rpetrich

+0

Simple y da resultados muy consistentes. – krsteeve

2

Utilice la orientación barra de estado en lugar de detectarlo.

UIInterfaceOrientation orientation = [UIApplication sharedApplication] .statusBarOrientation;

luego realice el if en la "orientación" que ha obtenido desde arriba.

+0

Cuidado: la InterfaceOrientation (= orientación de la barra de estado) es * no * ¡la misma que la orientación del dispositivo! Por lo tanto, no es adecuado para detectar la detección de un dispositivo. – auco

+2

Para todos los propósitos, me da un resultado de orientación más consistente y preciso que la clase UIDevice y su método. – Bourne

19

Esta es la mejor manera de verificar la orientación en el lanzamiento. En primer lugar, crear un nuevo método en su AppDelegate que comprueba la orientación:

-(void)checkLaunchOrientation:(id)sender{ 

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;  
    BOOL isLandscape = UIDeviceOrientationIsLandscape(self.viewController.interfaceOrientation); 

    if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape) { 
     //do stuff here 
    } 
} 

Al final de -application:didFinishLaunchingWithOptions: plazo

 [self performSelectorOnMainThread:@selector(checkLaunchOrientation:) withObject:nil waitUntilDone:NO]; 
+1

¡Gran solución! Comprobando la orientación '[[UIDevice currentDevice]]] de _inside_' -application: didFinishLaunchingWithOptions: 'devolvió la orientación desconocida, pero comprobando desde un método ejecutado usando' performSelectorOnMainThread: withOptions: waitUntilDone: 'funciona perfectamente. –

+0

NOTA: No funciona con iOS 7. –

0

No es que se necesita otra respuesta, pero pensé que debería añadir que casi nunca desea utilizar [[UIDevice currentDevice] orientation]. Ese método devuelve la orientación del dispositivo, que no es necesariamente la misma que la orientación de la interfaz.

4

Como se menciona en una publicación de blog anterior, hay un conjunto de macros para probar la orientación. Sin embargo, esa publicación de blog menciona UIDeviceOrientationIsPortrait. Me gusta lo siguiente a continuación, es un giro menor.

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) 
{ 
    NSLog(@"Portrait"); 
} 
else 
{ 
    NSLog(@"Landscape"); 
} 

Una observación que he hecho es que no se puede llamar a este código en una vista de tabla, empujados en un controlador de navegación integrado en el controlador de la vista dividida. En otras palabras, no puede llamarlo desde el controlador de vista maestra. Debe reemplazar la "self.interfaceOrientation" con splitviewcontroller.interfaceOrientation, suponiendo que mantiene una referencia al controlador de vista dividida principal.

1

Así que la pregunta es sobre la comprobación de la orientación en el inicio. La respuesta es tristemente "No puedes".

Pero DESPUÉS arranque, puede comprobar la orientación de la forma habitual (como han descrito otros).

Si alguien más viene aquí buscando una respuesta, simplemente pare de buscar ya que, al inicio, la variable de orientación no está configurada (todas las vistas marcos/límites también informan estar en retrato incluso si no lo están).

0

No es cierto que no se pueda determinar la orientación de lanzamiento, es cierto que es un dolor en la parte trasera hacerlo.

esto es lo que necesita hacer.

su primer UIViewController necesita tener una lógica especial para captar la información que desea.
es posible que desee crear un UIStartupController solo para estos fines si es tan importante para su flujo.
en el caso de mi proyecto, ya teníamos presente un controlador de inicio de este tipo.

todo lo que necesita es el código

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    self.launchOrientation = UIDeviceOrientationUnknown; 
    } 
    return self; 
} 

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration 
{ 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    if (self.launchOrientation == UIDeviceOrientationUnknown && duration > 0) 
    self.launchOrientation = UIInterfaceOrientationPortrait; 
    else 
    self.launchOrientation = toInterfaceOrientation; 
} 

siguiendo básicamente, si no estamos en el lanzamiento de UIInterfaceOrientationPortrait, la primera secuencia de rotación de devolución de llamada en realidad revelan la orientación del lanzamiento.
si se inicia en UIInterfaceOrientationPortrait, entonces debemos verificar que la duración de la primera rotación no sea cero, y entonces sabemos que se inició desde el retrato.

Cuestiones relacionadas