rotar rotacion plus pantalla girar gira desactivar iphone objective-c ios orientation gyroscope

rotacion - rotar pantalla iphone 6



Detectando el cambio de orientaciĆ³n de iOS al instante (6)

Tengo un juego en el que la orientación del dispositivo afecta el estado del juego. El usuario debe cambiar rápidamente entre las orientaciones Horizontal, Vertical e Invertir Horizontal. Hasta ahora he estado registrando el juego para recibir notificaciones de orientación a través de:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

Pero es demasiado lento: parece que hay aproximadamente un segundo retraso entre la rotación del teléfono y la notificación que se está disparando. Necesito una forma de detectar al instante los cambios en la orientación del dispositivo. He intentado experimentar con el giroscopio, pero todavía no estoy lo suficientemente familiarizado como para saber si es la solución que estoy buscando.


¿Por qué no usaste?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

?

O puedes usar esto

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

O esto

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

Espero que el búho sea útil)


Agregar un notificador en la función viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; }

El cambio de orientación notifica esta función.

- (void)orientationChanged:(NSNotification *)notification{ [self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; }

que a su vez llama a esta función donde se maneja la trama moviePlayerController es la orientación

- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation { switch (orientation) { case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: { //load the portrait view } break; case UIInterfaceOrientationLandscapeLeft: case UIInterfaceOrientationLandscapeRight: { //load the landscape view } break; case UIInterfaceOrientationUnknown:break; } }

En viewDidDisappear elimina la notificación.

-(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; }

Supongo que esto es lo más rápido que puede haber cambiado la vista según la orientación


En mi caso, el manejo de UIDeviceOrientationDidChangeNotification no fue una buena solución ya que se llama más frecuente y UIDeviceOrientation no siempre es igual a UIInterfaceOrientation debido a (FaceDown, Face Up).

Lo manejo con UIApplicationDidChangeStatusBarOrientationNotification :

//To add the notification [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation:) //to remove the [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; ... - (void)didChangeOrientation:(NSNotification *)notification { UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if (UIInterfaceOrientationIsLandscape(orientation)) { NSLog(@"Landscape"); } else { NSLog(@"Portrait"); } }


Intenta hacer tus cambios en:

- (void) viewWillLayoutSubviews {}

El código se ejecutará en cada cambio de orientación a medida que las subvistas se distribuyan nuevamente.


La demora de la que habla es en realidad un filtro para evitar notificaciones de cambio de orientación falsas (no deseadas).

Para el reconocimiento instantáneo del cambio de orientación del dispositivo, solo tendrá que controlar el acelerómetro usted mismo.

El acelerómetro mide la aceleración (gravedad incluida) en los 3 ejes, por lo que no debería tener ningún problema para determinar la orientación real.

Algunos códigos para comenzar a trabajar con el acelerómetro se pueden encontrar aquí:

Cómo hacer una aplicación para iPhone - Parte 5: El acelerómetro

Y este bonito blog cubre la parte de matemáticas:

Usando el acelerómetro


La respuesta de @vimal no me dio solución. Parece que la orientación no es la orientación actual, sino desde la orientación anterior. Para solucionarlo, uso la [[UIDevice currentDevice] orientation]

- (void)orientationChanged:(NSNotification *)notification{ [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]]; }

Entonces

- (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... }

Con este código obtengo la posición de orientación actual.