rotar para pantalla españa apple ios objective-c orientation uidevice

ios - para - itunes



¿Cómo detecto la orientación del dispositivo en iOS? (10)

Tengo una pregunta sobre cómo detectar la orientación del dispositivo en iOS. No necesito recibir notificaciones de cambio, solo la orientación actual. Esta parece ser una pregunta bastante simple, pero no he sido capaz de entenderlo. Debajo está lo que he hecho hasta ahora:

UIDevice *myDevice = [UIDevice currentDevice] ; [myDevice beginGeneratingDeviceOrientationNotifications]; UIDeviceOrientation deviceOrientation = myDevice.orientation; BOOL isCurrentlyLandscapeView = UIDeviceOrientationIsLandscape(deviceOrientation); [myDevice endGeneratingDeviceOrientationNotifications];

En mi opinión, esto debería funcionar. Habilito el dispositivo para recibir avisos de orientación del dispositivo, luego pregunto en qué orientación se encuentra, pero luego no funciona y no sé por qué.


En Swift 3.0

para obtener la orientación del dispositivo.

/* return current device orientation. This will return UIDeviceOrientationUnknown unless device orientation notifications are being generated. */ UIDevice.current.orientation

para obtener la orientación del dispositivo desde su aplicación

UIApplication.shared.statusBarOrientation


¡Para lo que está buscando primero, debe recibir la notificación si la orientación cambió! Puede configurar esto en viewDidLoad como

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(OrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];

y siempre que la Orientación de su Dispositivo cambió OrientaciónCambio Llamado donde puede hacer lo que quiera según la Orientación

-(void)OrientationDidChange:(NSNotification*)notification { UIDeviceOrientation Orientation=[[UIDevice currentDevice]orientation]; if(Orientation==UIDeviceOrientationLandscapeLeft || Orientation==UIDeviceOrientationLandscapeRight) { } else if(Orientation==UIDeviceOrientationPortrait) { } }


¿Has desbloqueado el bloqueo de hardware para la orientación del dispositivo? Hay uno en el borde de mi iPad 1.


Aquí hay algunas variables de Swift para facilitar la detección:

let LANDSCAPE_RIGHT: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight let LANDSCAPE_LEFT: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft let LANDSCAPE: Bool = LANDSCAPE_LEFT || LANDSCAPE_RIGHT let PORTRAIT_NORMAL: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.Portrait let PORTRAIT_REVERSE: Bool = UIDevice.currentDevice().orientation == UIDeviceOrientation.PortraitUpsideDown let PORTRAIT: Bool = PORTRAIT_REVERSE || PORTRAIT_NORMAL


Hay una manera de lograr esto si el bloqueo de orientación está habilitado o no utilizando datos de CoreMotion. Este es el código:

#import <CoreMotion/CoreMotion.h> CMMotionManager *cm=[[CMMotionManager alloc] init]; cm.deviceMotionUpdateInterval=0.2f; [cm startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *data, NSError *error) { if(fabs(data.gravity.x)>fabs(data.gravity.y)){ NSLog(@"LANSCAPE"); if(data.gravity.x>=0){ NSLog(@"LEFT"); } else{ NSLog(@"RIGHT"); } } else{ NSLog(@"PORTRAIT"); if(data.gravity.y>=0){ NSLog(@"DOWN"); } else{ NSLog(@"UP"); } } }];


Hilo muy viejo, pero no hay solución real.

Tuve el mismo problema, pero descubrí que obtener UIDeviceOrientation no siempre es coherente, así que, en su lugar, usa esto:

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if(orientation == 0) //Default orientation //UI is in Default (Portrait) -- this is really a just a failsafe. else if(orientation == UIInterfaceOrientationPortrait) //Do something if the orientation is in Portrait else if(orientation == UIInterfaceOrientationLandscapeLeft) // Do something if Left else if(orientation == UIInterfaceOrientationLandscapeRight) //Do something if right


No se cumplió con "UIDeviceOrientation" porque cuando una orientación de UIViewcontroller se fija en una orientación específica, no se obtiene una información pertinente con la orientación del dispositivo, por lo que lo correcto es usar "UIInterfaceOrientation" .

Puede obtener la orientación del UIViewController con una "self.interfaceOrientation" , pero cuando está factorizando nuestro código, es posible que tenga que hacer este tipo de prueba fuera de un controlador de vista, (vista personalizada, una categoría ...), por lo que aún puede acceder a la información en cualquier lugar fuera del controlador utilizando el control rootviewController :

if (UIInterfaceOrientationIsLandscape(view.window.rootViewController.interfaceOrientation)) { }


Si desea obtener la orientación del dispositivo directamente desde el acelerómetro, use la orientación [[UIDevice currentDevice] orientation] . Pero si necesita la orientación actual de su aplicación ( orientación de la interfaz ), use [[UIApplication sharedApplication] statusBarOrientation] .


si UIViewController:

if (UIDeviceOrientationIsLandscape(self.interfaceOrientation)) { // }

si UIView:

if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { // }

UIDevice.h:

#define UIDeviceOrientationIsPortrait(orientation) ((orientation) == UIDeviceOrientationPortrait || (orientation) == UIDeviceOrientationPortraitUpsideDown) #define UIDeviceOrientationIsLandscape(orientation) ((orientation) == UIDeviceOrientationLandscapeLeft || (orientation) == UIDeviceOrientationLandscapeRight)

Actualizado :

agregue este código a xxx-Prefix.pch y luego puede usarlo en cualquier lugar:

// check device orientation #define dDeviceOrientation [[UIDevice currentDevice] orientation] #define isPortrait UIDeviceOrientationIsPortrait(dDeviceOrientation) #define isLandscape UIDeviceOrientationIsLandscape(dDeviceOrientation) #define isFaceUp dDeviceOrientation == UIDeviceOrientationFaceUp ? YES : NO #define isFaceDown dDeviceOrientation == UIDeviceOrientationFaceDown ? YES : NO

uso:

if (isLandscape) { NSLog(@"Landscape"); }


UIViewController tiene una propiedad interfaceOrientation que puede acceder para conocer la orientación actual de un controlador de vista.

En cuanto a tu ejemplo, eso debería funcionar. Cuando dices que no está funcionando, ¿qué quieres decir? ¿Qué resultados le ofrece frente a lo que esperaba?