ios - rotacion - rotar pantalla iphone 6
Cómo forzar a UIViewController a la orientación vertical en iOS 6 (16)
1) Verifique la configuración de su proyecto e info.plist y asegúrese de que solo se seleccionen las orientaciones que desea.
2) agregue los siguientes métodos a su controlador de vista superior (controlador de navegación / controlador tabbar)
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
3) agregue los siguientes métodos a su delegado de la aplicación
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortrait;
}
Como la ShouldAutorotateToInterfaceOrientation
está obsoleta en iOS 6 y la usé para forzar una vista en particular solo para el retrato , ¿cuál es la forma correcta de hacerlo en iOS 6? Esto es solo para un área de mi aplicación, todas las otras vistas pueden rotar.
Así que me encontré con el mismo problema cuando visualicé solo vistas modales de retrato. Normalmente, crearía un UINavigationController
, establecer viewController
como rootViewController
y luego mostrar UINavigationController
como una vista modal. Pero con iOS 6, viewController
ahora le pedirá al navigationController sus orientaciones de interfaz compatibles (que, de forma predeterminada, ahora es todo para iPad y todo, pero al revés para iPhone).
Solución : tuve que hacer una subclase de UINavigationController
y anular los métodos de autorrotación. Tipo de cojo
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
Esta respuesta se relaciona con las preguntas formuladas en los comentarios de la publicación del PO:
Para forzar que una vista aparezca en una orientación dada, coloque lo siguiente en la vista Aparecerá:
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
}
Es un truco, pero esto obliga a UIViewController
a presentarse en vertical, incluso si el controlador anterior era horizontal
ACTUALIZACIÓN para iOS7
Los métodos anteriores ahora están en desuso, por lo tanto, para iOS 7, use lo siguiente:
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[c.view setBackgroundColor:[UIColor redColor]];
[self.navigationController presentViewController:c animated:NO completion:^{
[self.navigationController dismissViewControllerAnimated:YES completion:^{
}];
}];
}
Curiosamente, al momento de escribir, el presente o el despido deben ser animados. Si ninguno de los dos tiene, entonces obtendrá una pantalla blanca. No tengo idea de por qué esto lo hace funcionar, ¡pero lo hace! El efecto visual es diferente dependiendo de cuál sea animado.
IOS 5
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
ios 6
-(BOOL)shouldAutorotate{
return YES;
}
-(NSInteger)supportedInterfaceOrientations{
// UIInterfaceOrientationMaskLandscape;
// 24
//
// UIInterfaceOrientationMaskLandscapeLeft;
// 16
//
// UIInterfaceOrientationMaskLandscapeRight;
// 8
//
// UIInterfaceOrientationMaskPortrait;
// 2
// return UIInterfaceOrientationMaskPortrait;
// or
return 2;
}
La mejor manera para iOS6 específicamente se menciona en "iOS6 por Tutoriales" por el equipo de Ray Wenderlich - http://www.raywenderlich.com/ y es mejor que la subclasificación de UINavigationController
para la mayoría de los casos.
Estoy usando iOS6 con un guión gráfico que incluye un UINavigationController
configurado como el controlador de vista inicial.
//AppDelegate.m: este método no está disponible antes de iOS6, lamentablemente
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
//MyViewController.m - devuelve las orientaciones que quieras para cada UIViewController
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
Las respuestas que usan subclases o categorías para permitir VCs dentro de las clases UINavigationController y UITabBarController funcionan bien. Se produjo un error al iniciar un modal de solo retrato desde una barra de pestañas de paisaje. Si necesita hacer esto, use el truco de mostrar y ocultar una vista modal no animada, pero hágalo en el método viewDidAppear . No funcionó para mí en viewDidLoad o viewWillAppear.
Aparte de eso, las soluciones anteriores funcionan bien.
No estoy de acuerdo con @aprato answer, porque los métodos de rotación de UIViewController se declaran en categorías, lo que da como resultado un comportamiento indefinido si lo reemplaza en otra categoría. Es más seguro anularlos en una subclase UINavigationController (o UITabBarController)
Además, esto no cubre el escenario en el que empujas / presentas / pop desde una vista de Paisaje a una VC de solo retrato o viceversa. Para resolver este problema difícil (nunca abordado por Apple), debieras:
En iOS <= 4 e iOS> = 6:
UIViewController *vc = [[UIViewController alloc]init];
[self presentModalViewController:vc animated:NO];
[self dismissModalViewControllerAnimated:NO];
[vc release];
En iOS 5:
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[window addSubview:view];
Éstos obligarán REALMENTE a UIKit a reevaluar todas sus AuthorAutorotate, supportedInterfaceOrientations, etc.
No lo probé yo mismo, pero la documentación indica que ahora puede anular esos métodos: supportedInterfaceOrientations
y preferredInterfaceOrientationForPresentation
.
Probablemente pueda lograr lo que desea y establecer solo la orientación que desee en esos métodos.
No ser aburrido aquí, pero ¿sería tan amable de compartir su subclase? Gracias.
editar: bueno, finalmente lo hice, la subclase era muy fácil de hacer. Solo tuve que declarar el navigationController
en el AppDelegate
como UINavigationControllerSubclass
lugar del UINavigationController
predeterminado, luego modifiqué tu subclase con:
- (BOOL)shouldAutorotate {
return _shouldRotate;
}
entonces puedo configurar cualquier vista que quiera rotar o no llamando a viewDidLoad
_navController = (UINavigationController *)self.navigationController;
[_navController setShouldRotate : YES / NO]
Espero que este ajuste ayude a otros también, ¡gracias por tu consejo!
Consejo: haga uso de
- (NSUInteger)supportedInterfaceOrientations
en sus controladores de vista, para que no termine teniendo un retrato deseado en el paisaje o viceversa.
Para Monotouch puedes hacerlo de esta manera:
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
return UIInterfaceOrientationMask.LandscapeRight;
}
public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation()
{
return UIInterfaceOrientation.LandscapeRight;
}
Ponlo en el archivo .m de cada ViewController
que no quieras rotar:
- (NSUInteger)supportedInterfaceOrientations
{
//return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
return UIInterfaceOrientationMaskPortrait;
}
Mira developer.apple.com/library/ios/#featuredarticles/… para más información.
Si desea que todos nuestros controladores de navegación respeten el controlador de vista superior, puede usar una categoría para no tener que pasar por un grupo de nombres de clase.
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
Como algunos de los comentarios señalan, esta es una solución rápida al problema. Una mejor solución es la subclase UINavigationController y pone estos métodos allí. Una subclase también ayuda a soportar 6 y 7.
Simplemente vaya a project.plist luego agregue la orientación de la interfaz compatible y luego agregue solo Portrait (botón de inicio) y Portrait (botón de inicio superior).
Puede agregar o eliminar la orientación según los requisitos del proyecto.
Gracias
Tengo un enfoque muy bueno para mezclar https://.com/a/13982508/2516436 y https://.com/a/17578272/2516436
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [self topViewControllerWithRootViewController:self.window.rootViewController];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
y devuelva las orientaciones que desee para cada UIViewController
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
Tengo una aplicación universal relativamente compleja que usa UISplitViewController y UISegmentedController, y tengo algunas vistas que deben presentarse en Landscape usando presentViewController
. Utilizando los métodos sugeridos anteriormente, pude hacer que iPhone ios 5 y 6 funcionaran de forma aceptable, pero por alguna razón el iPad simplemente se negó a presentarlo como Paisaje. Finalmente, encontré una solución simple (implementada después de horas de lectura y prueba y error) que funciona para ambos dispositivos y iOS 5 y 6.
Paso 1) En el controlador, especifique la orientación requerida (más o menos como se indica arriba)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
NSInteger mask = UIInterfaceOrientationMaskLandscape;
return mask;
}
Paso 2) Cree una subclase UINavigationController simple e implemente los siguientes métodos
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
Paso 3) Presente su viewController
vc = [[MyViewController alloc]init];
MyLandscapeNavigationController *myNavigationController = [[MyLandscapeNavigationController alloc] initWithRootViewController:vc];
[self myNavigationController animated:YES completion:nil];
Espero que esto sea útil para alguien.
Veo muchas respuestas, pero no obtengo la idea y la respuesta en particular sobre la orientación, pero veo que el enlace comprende bien la orientación y elimina la rotación forzada de ios6.
http://www.disalvotech.com/blog/app-development/iphone/ios-6-rotation-solution/
Creo que es ayuda completa.