iOS: orientación del dispositivo en la carga

Parece que cuando se carga mi aplicación, no conoce su orientación actual:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; if (orientation == UIDeviceOrientationPortrait) { NSLog(@"portrait");// only works after a rotation, not on loading app } 

Una vez que giro el dispositivo, obtengo una orientación correcta, pero cuando cargo la aplicación, sin cambiar la orientación, parece que usar [[UIDevice currentDevice] orientation] no conoce la orientación actual.

¿Hay alguna otra manera de verificar esto cuando primero carga mi aplicación?

EDITAR: Leí mal tu pregunta. Esto le permitirá iniciar su aplicación en ciertas orientaciones. Solo me di cuenta de que estás tratando de descubrir la orientación en el lanzamiento.

Hay un método para verificar la orientación de la barra de estado en UIApplication :

 [[UIApplication sharedApplication] statusBarOrientation]; 

Respuesta original

Intente configurar las orientaciones del dispositivo aceptadas de la aplicación en el archivo plist:

 UISupportedInterfaceOrientations  UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight  

Esto indicará que su aplicación admite Retrato (botón de inicio en la parte inferior), paisaje a la izquierda y paisaje a la derecha.

Luego, en sus UIViewControllers, tendrá que anular el shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) para devolver SÍ cuando la aplicación deba girar:

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

Esto le indicará al UIViewController que gire automáticamente si el dispositivo está en una de sus orientaciones admitidas. Si también quieres apoyar la orientación invertida (retrato con el botón de inicio en la parte superior), agrégalo a tu lista y devuelve SÍ con este método.

Haganos saber como funciona.

Creo que esto funcionará

  [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation; 

De acuerdo con la referencia de UIDevice:
Citar:
“El valor de esta propiedad siempre devuelve 0 a menos que las notificaciones de orientación se hayan habilitado llamando a beginGeneratingDeviceOrientationNotifications”
Inicialmente había asumido que esta propiedad contenía la orientación actual en todo momento, pero no así, al parecer. Supongo que las notificaciones de activación se manejan detrás de escena en otras situaciones donde normalmente se accede a la propiedad de orientación, por lo que no era obvio que esto deba hacerse manualmente dentro del delegado de la aplicación.

Una cosa que nadie ha tocado todavía es que esté almacenando tipos de UIDeviceOrientation en una variable UIInterfaceOrientation . Son diferentes, y no deben ser tratados como iguales. Tenga en cuenta que UIDeviceOrientationLeft es igual a UIInterfaceOrientationRight (ya que la interfaz gira en sentido opuesto en comparación con el dispositivo).

Puedes hacerlo insertando la siguiente notificación dentro

 -(void)viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 

luego pon el siguiente método dentro de tu clase

 -(void)checkRotation:(NSNotification*)notification { UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { //Do your textField animation here } } 

El método anterior verificará la orientación de la barra de estado del ipad o del iPhone y, según lo que haga, realizará su animación con la orientación requerida.

En carga, la orientación del dispositivo puede ser .Unknown o .FaceUp . Para saber si es vertical u horizontal, utilizo statusBarOrientation como una copia de seguridad, como esta:

  var portraitOrientation = UIDevice.currentDevice().orientation == .Portrait if UIDevice.currentDevice().orientation == .Unknown || UIDevice.currentDevice().orientation == .FaceUp { portraitOrientation = UIApplication.sharedApplication().statusBarOrientation == .Portrait } 

De esta forma puedo asegurar que portraitOrientation siempre me dice si el dispositivo está en modo vertical, y si no, estará en horizontal. Incluso al cargar la aplicación por primera vez.

el problema es que la [UIDevice currentDevice]orientation] veces informa incorrectamente la orientación del dispositivo.

en su lugar, use [[UIApplication sharedApplication]statusBarOrientation] que es una UIInterfaceOrientation por lo que para verificarlo necesitará usar UIInterfaceOrientationIsLandscape(orientation)

espero que esto ayude.

Para obtener la orientación de la barra de estado, también es importante tener todas las orientaciones habilitadas en el archivo plist.

Swift 3 basado en el código de @Marjin.

 var portraitOrientation = UIDevice.current.orientation == .portrait if UIDevice.current.orientation == .unknown || UIDevice.current.orientation == .faceUp { portraitOrientation = UIApplication.shared.statusBarOrientation == .portrait } if(portraitOrientation) { // Portrait } else { } 

Pruebe el acelerómetro para obtener su lectura, UIAccelerometer, obtenga el acelerómetro compartido, establezca su delegado, obtenga las lecturas, determine la orientación desde allí.

Intenté todos y no hubo buenos resultados. Entonces, lo que hice, como estoy en un ipad, fue dejar todo el trabajo a los métodos splitViewController para invalidar el barButton:

Para el retrato:

 - (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc { NSlog(@"portrait");} 

Para el paisaje:

 - (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem{ NSlog(@"landscape");} 

esto siempre funciona con carga.

Todavía uso este fragmento de código que funciona para el iphone 4:

 -(void)deviceOrientationDidChange:(NSNotification *)notification{ //Obtaining the current device orientation UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; int value = 0; if(orientation == UIDeviceOrientationPortrait) { value = 0; }else if(orientation == UIDeviceOrientationLandscapeLeft) { value = 90; }else if(orientation == UIDeviceOrientationLandscapeRight) { value = -90; } CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(value)); [photoImageView setTransform:cgCTM]; 

}

Esta es la verdadera respuesta. Cuando se inicia una aplicación, su orientación es desconocida. Utiliza shouldAutorotateToInterfaceOrientation y supportedInterfaceOrientations para decidir qué orientación elegir.

Mire como comienzo una aplicación de muestra en el simulador de iPhone 5.0 y gírela usando el código a continuación y ‘Orientaciones de interfaz compatibles’ con las 4 orientaciones posibles:

 20:44:08.218 RotationTestApp Supported orientation: Portrait 20:44:08.222 RotationTestApp Supported orientation: Portrait (upside-down) 20:44:08.225 RotationTestApp Supported orientation: Landscape (home button on the right) 20:44:08.225 RotationTestApp Supported orientation: Landscape (home button on the left) 20:44:08.226 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (current device orientation: UIDeviceOrientationUnknown, interface orientation wants: UIInterfaceOrientationPortrait) 20:44:08.237 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (current device orientation: UIDeviceOrientationUnknown, interface orientation wants: UIInterfaceOrientationPortrait) 20:44:08.239 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (current device orientation: UIDeviceOrientationUnknown, interface orientation wants: UIInterfaceOrientationPortrait) 20:44:08.240 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (current device orientation: UIDeviceOrientationUnknown, interface orientation wants: UIInterfaceOrientationPortrait) 20:44:09.817 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationLandscapeLeft) 20:44:09.833 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationLandscapeLeft) 20:44:11.030 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationPortraitUpsideDown) 20:44:11.040 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationPortraitUpsideDown) 20:44:12.599 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationLandscapeRight) 20:44:12.609 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationLandscapeRight) 20:44:13.301 RotationTestApp shouldAutorotateToInterfaceOrientation: YES (device orientation: UIDeviceOrientationPortraitUpsideDown) 

He visto muchos fragmentos de código, pero ninguno funciona de manera genérica (iPad y iPhone, iOS 5.0 o superior).

En lugar de buscar a tientas try-this-try-that, coloca lo siguiente en tu raíz vc:

 #define ToNSString_BEGIN(T) \ NSString* T##ToNSString(T valueParameter) { \ switch (valueParameter) { #define ToNSString_VALUE(value) \ case value: return @#value #define ToNSString_END(T) \ } \ return @"(unknown)"; \ } // NSString* UIInterfaceOrientationToNSString(UIInterfaceOrientation); ToNSString_BEGIN(UIInterfaceOrientation); ToNSString_VALUE(UIInterfaceOrientationPortrait); // 1 ToNSString_VALUE(UIInterfaceOrientationPortraitUpsideDown); // 2 ToNSString_VALUE(UIInterfaceOrientationLandscapeLeft); // 3 ToNSString_VALUE(UIInterfaceOrientationLandscapeRight); // 4 ToNSString_END (UIInterfaceOrientation); // NSString* UIDeviceOrientationToNSString(UIDeviceOrientation); ToNSString_BEGIN(UIDeviceOrientation); ToNSString_VALUE(UIDeviceOrientationUnknown); // 0 ToNSString_VALUE(UIDeviceOrientationPortrait); // 1 ToNSString_VALUE(UIDeviceOrientationPortraitUpsideDown); // 2 ToNSString_VALUE(UIDeviceOrientationLandscapeLeft); // 3 ToNSString_VALUE(UIDeviceOrientationLandscapeRight); // 4 ToNSString_VALUE(UIDeviceOrientationFaceUp); // 5 ToNSString_VALUE(UIDeviceOrientationFaceDown); // 6 ToNSString_END (UIDeviceOrientation); // Change this custom method to alter auto-rotation behavior on all supported iOS versions and platforms. - (BOOL)allowAutoRotate:(UIInterfaceOrientation)interfaceOrientation { NSUInteger interfaceOrientationAsMask = (1<  

Todavía hay un problema persistente de animaciones segue que no usan la orientación actual. Supongo que subclasificar cada VC y orientar al delegado de push / notify en el pop sería el camino a seguir.

También es importante:

shouldAutorotateToInterfaceOrientation no funciona

tabBarController y navigationControllers en modo apaisado, episodio II

Prueba este. es trabajo para mi Gnarly en ese momento del método de lanzamiento terminado no detecta la orientación del dispositivo. su toma por defecto como retrato. asi que. Estoy usando para verificar la orientación de la barra de estadísticas. pruebo este código ponlo en el método didfinishedlaunch en appdeleget.

UIInterfaceOrientation orientation = [UIApplication sharedApplication] .statusBarOrientation;

 if(orientation == 0) {//Default orientation //UI is in Default (Portrait) -- this is really a just a failsafe. NSLog("for portrait"); }else if(orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { NSLog("portrait"); }else if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { NSLog("Landscap"); } 

Pruebe This one [[UIApplication sharedApplication] statusBarOrientation];

o implementar este en delegado de aplicación

 (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; } 

funciona

para aquellos que buscan respuesta para Swift 3 o 4. simplemente agregue ese código dentro del bloque viewDidLoad ().

 `let orientation = UIApplication.shared.statusBarOrientation if orientation == .portrait { // portrait } else if orientation == .landscapeRight || orientation == .landscapeLeft{ // landscape }` 

Todos los usuarios anteriores publicaron respuestas muy válidas, pero como una ACTUALIZACIÓN: la opinión de Apple: debe usar las orientaciones de UIStatusBar para leer la orientación actual del dispositivo:

Una forma de comprobar la orientación actual del dispositivo es mediante el uso de valores int como tales, dentro del método viewDidLoad :

  int orientationType = [[UIDevice currentDevice] orientation]; 

donde considere lo siguiente. . . – 1 = retrato (hacia arriba) – 2 = retrato al revés – 3 = paisaje (derecha) – 4 = paisaje (izquierda)

y luego podría usar una instrucción IF para llamar a un método después de que se detecte la orientación, y así sucesivamente:

Espero que esto sea un poco útil para alguien