item custom bar iphone objective-c ios ios5 uinavigationcontroller

iphone - custom - navigationbar swift



UINavigationController Force Rotate (3)

Mi aplicación es principalmente vertical, sin embargo, hay una vista que REQUIERE una orientación horizontal.

Mis puntos de vista están contenidos dentro de un UINavigationController, que (aparentemente) es la causa de este problema.

Todos los controladores de UIView, excepto uno, tienen esto:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); }

El controlador UIViewController que requiere Landscape tiene esto:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); }

Ahora, lo que sucede es que cuando el usuario alcanza el UIViewController horizontal, se muestra en vertical. Luego, el usuario puede girar su teléfono y se muestra en horizontal como yo quiero (bloqueando en horizontal). Luego, el usuario avanza a un UIViewController vertical y sucede lo mismo: comienza en horizontal, luego gira su teléfono y vuelve a ser vertical (y se bloquea en vertical).

Parece que el bloqueo de orientación está permitido entre los controladores UIView, sin embargo, la rotación automática / el cambio programático de la orientación está bloqueado de alguna manera.

¿Cómo fuerzo al teléfono para que actualice a la orientación correcta?

Existe una solución temporal: puedo detectar la orientación del dispositivo y mostrar un mensaje pidiéndoles que rote el dispositivo si no es correcto, sin embargo, esto no es óptimo.


¡¡¡Tenía el mismo requisito para una de mis aplicaciones !!!

Por suerte encontré una solución!

Con el fin de mantener el panorama del controlador de vista principal, sin importar de qué orientación se abrió / empujó, hice lo siguiente: (en viewWillAppear :)

//set statusbar to the desired rotation position [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; //present/dismiss viewcontroller in order to activate rotating. UIViewController *mVC = [[[UIViewController alloc] init] autorelease]; [self presentModalViewController:mVC animated:NO]; [self dismissModalViewControllerAnimated:NO];

PSTested en sdk 3.2.5 ios 5.0.1.

PS En iOS 8, la respuesta anterior da como resultado un parpadeo en la pantalla y, además, no es estable (en algunos casos ya no funciona para mí). Por lo tanto, para mis necesidades, cambié el código a: (ARC)

//set statusbar to the desired rotation position [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; [self.navigationController presentViewController:[UIViewController new] animated:NO completion:^{ dispatch_after(0, dispatch_get_main_queue(), ^{ [self.navigationController dismissViewControllerAnimated:NO completion:nil]; }); }]; //I added this code in viewDidDissapear on viewController class, which will be popped back.

¡Espero que te ayude!


Esto podría ayudar. Puede llamar al siguiente método al aparecer, cuando corresponda. por ejemplo, en -viewWillAppear:animated

tryRotationToDeviceOrientation Intenta rotar todas las ventanas a la orientación del dispositivo.

+ (void)attemptRotationToDeviceOrientation

Discusión

Es posible que algunos controladores de vista deseen utilizar condiciones específicas de la aplicación para determinar el valor de retorno de su implementación del método shouldAutorotateToInterfaceOrientation :. Si su controlador de vista hace esto, cuando cambian esas condiciones, su aplicación debería llamar a este método de clase. El sistema inmediatamente intenta rotar a la nueva orientación. Se produce una rotación siempre que cada controlador de vista relevante devuelva SÍ en su implementación del método shouldAutorotateToInterfaceOrientation :.

Disponibilidad

Disponible en iOS 5.0 y versiones posteriores. http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html


Utilizar esta,

[[UIDevice currentDevice]performSelector:@selector(setOrientation:) withObject:(__bridge id)((void *)UIInterfaceOrientationLandscapeRight)];