iOS: orientación del dispositivo al cargar

Parece que cuando mi aplicación se carga, no sabe 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 gire el dispositivo, obtengo una orientación correcta, pero cuando carga la aplicación sin cambiar la orientación, parece que al usar [[UIDevice currentDevice] orientation] no conozco la orientación actual.

¿Hay otra forma de comprobar esto cuando primero cargué mi aplicación?

EDIT: leo mal tu pregunta Esto le permitirá comenzar su aplicación en ciertas orientaciones. Acabo de darme count de que estás intentando averiguar la orientación en el lanzamiento.

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

 [[UIApplication shanetworkingApplication] statusBarOrientation]; 

Respuesta original

Intente configurar las orientaciones de dispositivo aceptadas de la aplicación en el file Plist:

 <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array> 

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

Luego, en su UIViewControllers, tendrá que anular el shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) para devolver YES cuando la aplicación debe rotar:

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

Esto le indicará a UIViewController que gire automáticamente si el dispositivo se encuentra en una de las orientaciones admitidas. Si también quisieras apoyar la orientación al revés (retrato con el button de inicio en la parte superior), añádelo a tu plist y simplemente retorna SÍ fuera de este método.

Haganos saber como funciona.

Creo que esto funcionará:

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

Según la reference de UIDevice:
Citar:
"El valor de esta propiedad siempre devuelve 0 a less que se hayan habilitado las notifications de orientación llamando a beginGeneratingDeviceOrientationNotifications"
Inicialmente había asumido que esta propiedad contenía la orientación actual en todo momento, pero no así, al parecer. Creo que activar las notifications se está manejando para nosotros detrás de escena en otras situaciones en las que normalmente se accede a la propiedad de orientación, por lo que no era obvio que esto debe hacerse manualmente dentro del delegado de la aplicación

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

Puede hacerlo insertando la siguiente notificación dentro de

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

luego coloque el siguiente método dentro de su class

 -(void)checkRotation:(NSNotification*)notification { UIInterfaceOrientation orientation = [UIApplication shanetworkingApplication].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 iPhone y, de acuerdo con esto, hará su animation en la orientación requerida.

En la carga, la orientación del dispositivo puede ser .Unknown o .FaceUp . Para determinar si se trata de un retrato o un paisaje, utilizo el statusBarOrientation como una copy de security, así:

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

De esta manera puedo asegurar que portraitOrientation siempre me diga si el dispositivo está en modo vertical, y si no, estará en paisaje. 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 shanetworkingApplication]statusBarOrientation] que es un UIInterfaceOrientation por lo que para verificarlo necesitará usar UIInterfaceOrientationIsLandscape(orientation)

espero que esto ayude.

Para get la orientación desde la barra de estado, también es importante contar con todas las orientaciones habilitadas en el file Plist.

Prueba el acelerómetro para get su lectura, UIAccelerometer, comparte el Acelerómetro, establece su delegado, obtén las lecturas, descubre desde allí la orientación.

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

Para retrato:

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

Para paisaje:

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

esto siempre funciona con carga.

Todavía utilizo este fragment de código de trabajo 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 respuesta real. Cuando se inicia una aplicación, su orientación es desconocida. Utiliza shouldAutorotateToInterfaceOrientation y supportsInterfaceOrientations para decidir qué orientación escoger.

Mira como inicio una aplicación de ejemplo en el simulador de iPhone 5.0 y gíralo 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 fragments de código, pero ninguno funciona genéricamente (iPad y iPhone, iOS 5.0+).

En lugar de search a tientas con try-this-try-that, coloque lo siguiente en su 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<<interfaceOrientation); return interfaceOrientationAsMask & [self supportedInterfaceOrientations]; } // Reads from the project's-Info.plist - (NSUInteger)supportedInterfaceOrientations { static NSUInteger orientationsResult; if (!orientationsResult) { NSArray *supportedOrientations = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UISupportedInterfaceOrientations"]; for (id orientationString in supportedOrientations) { if ([orientationString isEqualToString:@"UIInterfaceOrientationPortrait"]) { orientationsResult |= UIInterfaceOrientationMaskPortrait; NSLog(@"Supported orientation: Portrait"); } else if ([orientationString isEqualToString:@"UIInterfaceOrientationPortraitUpsideDown"]) { orientationsResult |= UIInterfaceOrientationMaskPortraitUpsideDown; NSLog(@"Supported orientation: Portrait (upside-down)"); } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeRight"]) { orientationsResult |= UIInterfaceOrientationMaskLandscapeRight; NSLog(@"Supported orientation: Landscape (home button on the left)"); } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeLeft"]) { orientationsResult |= UIInterfaceOrientationMaskLandscapeLeft; NSLog(@"Supported orientation: Landscape (home button on the right)"); } else { NSLog(@"Unrecognized orientation '%@' in mainBundle plist, key UISupportedInterfaceOrientations", orientationString); } } } return orientationsResult; } // iOS 6+ (not yet used in 6.0.1) - (BOOL)shouldAutorotate { UIDeviceOrientation interfaceOrientationFromDevice = [UIDevice currentDevice].orientation; BOOL result = [self allowAutoRotate:interfaceOrientationFromDevice]; NSString *currentDeviceOrientation = UIDeviceOrientationToNSString(interfaceOrientationFromDevice); NSLog(@"shouldAutorotate: %s (current orientation %@)", result ? "YES" : "NO", currentDeviceOrientation); return result; } // iOS 2.0 - 5.1 (iOS 6+ deprecated, 6.0.1 still works) - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { NSString* orientationString; UIDeviceOrientation interfaceOrientationFromDevice = [UIDevice currentDevice].orientation; if ((int)interfaceOrientation != (int)interfaceOrientationFromDevice) { orientationString = [NSString stringWithFormat:@"current device orientation: %@, interface orientation wants: %@", UIDeviceOrientationToNSString(interfaceOrientationFromDevice), UIInterfaceOrientationToNSString(interfaceOrientation) ]; } else { orientationString = [NSString stringWithFormat:@"device orientation: %@", UIDeviceOrientationToNSString(interfaceOrientationFromDevice) ]; } BOOL result = [self allowAutoRotate:interfaceOrientation]; NSLog(@"shouldAutorotateToInterfaceOrientation: %s (%@)", result ? "YES" : "NO", orientationString); return result; } 

Todavía hay un problema persistente de que las animaciones segue no usen la orientación actual. Mi conjetura es que subclasificar cada VC y poner una cierta orientación en push / notify delegate en pop sería el path a seguir.

También es importante:

shouldAutorotateToInterfaceOrientation no funciona

tabBarController y navigationControllers en modo horizontal, episodio II

Prueba esta. es trabajo para mi gnarly en ese momento de didfinishedlaunch método no detectar orientación del dispositivo. se toma por defecto como retrato. asi que. Estoy usando para verificar la orientación de la barra de statistics. Probar este código. ponerlo en didfinishedlaunch method en appdeleget.

Orientación UIInterfaceOrientation = [UIApplication shanetworkingApplication] .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 este [[UIApplication shanetworkingApplication] statusBarOrientation];

o implementarlo en el delegado de la aplicación

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

funciona

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.shanetworking.statusBarOrientation == .portrait } if(portraitOrientation) { // Portrait } else { } 

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

Una forma de verificar la orientación actual del dispositivo es usando valores int como tales, dentro del método viewDidLoad :

  int orientationType = [[UIDevice currentDevice] orientation]; 

donde considere lo siguiente. . . – 1 = retrato (derecha 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