ios - rotacion - no quiero que la pantalla de mi iphone gire
Lanzar en orientación vertical desde una pantalla de inicio de iPhone 6 Plus en orientación horizontal da como resultado una orientación incorrecta (13)
El título real de esta pregunta es más largo de lo que puedo encajar:
Lanzar una aplicación cuyo controlador de vista raíz solo admite orientación vertical pero que de otro modo admite orientaciones horizontales en un iPhone 6 Plus mientras la pantalla de inicio está en orientación horizontal genera un estado de limbo donde la ventana de la aplicación tiene una orientación horizontal pero el dispositivo en una orientación vertical.
En resumen, se ve así:
Cuando se supone que debe verse así:
Pasos para reproducir:
iPhone 6 Plus con iOS 8.0.
Una aplicación cuyo plist admite orientaciones de todo-pero-retrato-boca abajo.
El controlador de vista raíz de la aplicación es un UITabBarController.
Todo, el controlador de la barra de pestañas y todos sus controladores de vista secundarios descendientes devuelven
UIInterfaceOrientationMaskPortrait
desupportedInterfaceOrientations
.Comience en la pantalla de inicio de iOS.
Gire hacia la orientación horizontal (requiere iPhone 6 Plus).
Lanzamiento en frío de la aplicación.
Resultado: orientaciones de interfaz rotas.
No se me ocurre otra forma de aplicar una orientación vertical, excepto para deshabilitar el paisaje por completo, lo que no puedo hacer: los controles de vista modal de nuestro navegador web necesitan un paisaje.
Incluso probé la subclasificación de UITabBarController y reemplazando las orientaciones de interfaz soportadas para devolver la máscara de solo retrato, pero esto (incluso con todos los demás pasos anteriores) no solucionó el problema.
Aquí hay un enlace a un proyecto de muestra que muestra el error.
Establecer el statusBarOrientation
de la aplicación UIApplication
parece funcionar para mí. Lo coloqué en el método de la application:didFinishLaunchingWithOptions:
en el delegado de la aplicación.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
application.statusBarOrientation = UIInterfaceOrientationPortrait;
// the rest of the method
}
Esto parece ser un error en iOS 8 cuando se utiliza un UITabBarController como controlador de vista raíz. Una solución consiste en utilizar un UIViewController casi en su totalidad como el controlador de vista raíz. Este controlador de vista de vanilla servirá como el controlador de vista padre de su controlador de barra de pestañas:
///------------------------
/// Portrait-Only Container
///------------------------
@interface PortraitOnlyContainerViewController : UIViewController
@end
@implementation PortraitOnlyContainerViewController
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
// Elsewhere, in app did finish launching ...
PortraitOnlyContainerViewController *container = nil;
container = [[PortraitOnlyContainerViewController alloc]
initWithNibName:nil
bundle:nil];
[container addChildViewController:self.tabBarController];
self.tabBarController.view.frame = container.view.bounds;
[container.view addSubview:self.tabBarController.view];
[self.tabBarController didMoveToParentViewController:container];
[self.window setRootViewController:container];
Estoy en la misma situación, y hacer [self.window setFrame: ...] no funciona para mí.
Agregar lo siguiente al final de la aplicación: didFinishLaunchingWithOptions es lo único que he encontrado que funciona. Hace que la pantalla parpadee y no es exactamente limpia y eficiente.
Lo agregué al final de la aplicación: didFinishLaunchingWithOptions:
UIViewController *portraitViewController = [[UIViewController alloc] init];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController];
[self.navController presentViewController:nc animated:NO completion:nil];
[self.navController dismissViewControllerAnimated:NO completion:nil];
[UIViewController attemptRotationToDeviceOrientation];
No tuve suerte la solución de Jared usando un controlador genérico de contenedor de vista. Ya he subclasificado el controlador de barra de pestañas con supportedInterfaceOrientations sin suerte también. Independientemente de la orientación del 6+ después del lanzamiento, la ventana de la barra de pestañas está informando frame = (0 0; 736 414)
Hasta ahora, la única solución que he encontrado es forzar el marco de la ventana después de makeKeyAndVisible
[self.window makeKeyAndVisible]; self.window.frame = CGRectMake(0, 0, MIN(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)), MAX(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)));
Para mí, estaba teniendo el mismo problema que jaredsinclair, pero la subclasificación de un UIViewController
con el método supportedInterfaceOrientations
no solucionaba el problema. En cambio, hice exactamente lo que hizo en mi método appDidFinishLaunching
de mi AppDelegate
y agregué mi UITabBarController
como un niño a un UIViewController
normal en lugar de su subclase y ¡funcionó!
Por favor intente con el siguiente código. Probablemente este problema causado por el tamaño de la ventana clave en el lanzamiento del paisaje.
// in application:didFinishLaunchingWithOptions: ...
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //<- ADD!!
Solo quiero que mi aplicación se abra en modo horizontal (y no muestre el problema que describe arriba en el iPhone 6 Plus), por lo que configuro Landscape (left home button)
y Landscape (right home button)
como las únicas orientaciones permitidas en mi aplicación Archivo PLIST. Esto soluciona el problema de orientación cuando se abre mi aplicación. Sin embargo, necesito que mi aplicación admita el modo retrato solo para una vista, ya que visualizo un UIImagePickerController
en mi aplicación, que Apple requiere que se muestre en modo retrato en iPhone.
Pude admitir el retrato para esa única vista, mientras mantengo mi aplicación abierta en modo horizontal, incluyendo el siguiente código en AppDelegate
:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
Tengo el mismo error en mi aplicación, lo descubrí con esta solution
En primer lugar, no funcionó, pero después de excavar, tengo que hacerlo en el controlador inicial después de la pantalla de bienvenida.
La respuesta es el lenguaje OjbC, déjame actualizarlo a Swift
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
No olvide que debería en el controlador de vista inicial.
Tuve el mismo problema cuando lanzamos nuestra aplicación en el paisaje en un iPhone 6 Plus.
Nuestra solución fue eliminar las orientaciones de interfaz compatibles con el paisaje desde el plist a través de la configuración del proyecto:
e implementar la aplicación: supportedInterfaceOrientationsForWindow: en el delegado de la aplicación:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
Aparentemente, la información en su lista es especificar a qué orientaciones puede lanzar su aplicación.
Tuve un problema muy similar. Quería forzar el modo de retrato en todas partes, excepto para reproducir videos.
Lo que hice fue:
1) para forzar la orientación de la aplicación para que esté en retrato en AppDelegate:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([window.rootViewController.presentedViewController isKindOfClass:[MPMoviePlayerViewController class]])
{
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
2) el lanzamiento de un controlador de vista modal vacío solucionó el problema en mi caso. Lo lanzo en viewDidLoad del primer controlador de vista que está en la raíz de mi NavigationViewController (el primer controlador de vista visible después de que se inicia la aplicación):
- (void)showAndHideNamelessViewControllerToFixOrientation {
UIViewController* viewController = [[UIViewController alloc] init];
[self presentViewController:viewController animated:NO completion:nil];
[viewController dismissViewControllerAnimated:NO completion:nil];
}
Tuve un problema similar cuando mi aplicación se ejecuta tanto en formato horizontal como vertical con un UITabBarController como controlador de vista raíz.
Cada vez que se iniciaba la aplicación cuando estaba en modo horizontal, la vista era incorrecta.
Todo lo que tuve que hacer fue eliminar la asignación del controlador de root en el XIB. - Añádalo manualmente una vez que se inicia la aplicación:
(void) applicationDidFinishLaunching: aplicación (UIAplication *) {application.statusBarHidden = YES;
[self.window setRootViewController: self.tabBarController];
Eso solucionó el problema.
solo llame a [application setStatusBarOrientation: UIInterfaceOrientationPortrait animated: NO]; en el método delegado de aplicación - aplicación (BOOL): aplicación (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions
de hecho, ahora el dispositivo es UIInterfaceOrientationPortrait después del lanzamiento, si toca un campo de entrada, el teclado es el diseño de retrato