¿Cómo establecer la orientación del dispositivo (UI) programáticamente?

Quisiera que todo en la pantalla (UI) pueda rotar desde el paisaje de izquierda a derecha o viceversa.

¿Cómo voy a hacer esto? Es esto privado?

Yo sé eso

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {} 

te permite decir qué orientaciones puede tener la IU, pero ¿hay alguna manera de forzar solo una a la vez?

Aclamaciones

Ese método se usa para determinar si su interfaz debe rotar automáticamente a una rotación dada (es decir, dejar que UIKit haga el trabajo duro, en lugar de hacerlo manualmente).

Entonces, si quisieras que tu aplicación solo funcionara en el paisaje, implementarías el cuerpo de ese método con:

return UIInterfaceOrientationIsLandscape(interfaceOrientation);

Si quisiera que su UI rotase automáticamente a todas las orientaciones, podría simplemente return YES;

¿Es eso lo que preguntabas?

En iOS [[UIDevice currentDevice] setDeviceOrientation:UIDeviceOrientationSomeOrientation] método está ausente. Pero podemos rotar una vista con la barra de estado, para esto:

 - (void)showAlbum { // check current orientation if ([[UIApplication sharedApplication] statusBarOrientation] != UIInterfaceOrientationLandscapeLeft) { // no, the orientation is wrong, we must rotate the UI self.navigationController.view.userInteractionEnabled = NO; [UIView beginAnimations:@"newAlbum" context:NULL]; [UIView setAnimationDelegate:self]; // when rotation is done, we can add new views, because UI orientation is OK [UIView setAnimationDidStopSelector:@selector(addAlbum)]; // setup status bar [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO]; // rotate main view, in this sample the view of navigation controller is the root view in main window [self.navigationController.view setTransform: CGAffineTransformMakeRotation(M_PI / 2)]; // set size of view [self.navigationController.view setFrame:CGRectMake(0, 0, 748, 1024)]; [UIView commitAnimations]; } else { [self addAlbum]; } } 

He tenido éxito con esto:

  if (self.interfaceOrientation != UIInterfaceOrientationPortrait) { // http://stackoverflow.com/questions/181780/is-there-a-documented-way-to-set-the-iphone-orientation // http://openradar.appspot.com/radar?id=697 // [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; // Using the following code to get around apple's static analysis... [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait]; } 

Si presenta un controlador de vista modal que implementa -shouldAutorotateToInterfaceOrientation: a Orientación de interfaz -shouldAutorotateToInterfaceOrientation: para admitir solo una orientación, toda la interfaz se -shouldAutorotateToInterfaceOrientation: automáticamente en ella. No creo que haya una manera de cambiar la orientación de manera programática.

También esta manera simple funciona:

 [[UIApplication sharedApplication] setStatusBarHidden:YES]; [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

y de vuelta:

 [[UIApplication sharedApplication] setStatusBarHidden:NO]; [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 

En Swift para cambiar la orientación a retrato:

 UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation") 

Ver: https://stackoverflow.com/a/24259601

Esto fue abordado por: Guntis Treulands https://stackoverflow.com/a/10146270/894671

 //----------------------------------- // FORCE PORTRAIT CODE //----------------------------------- [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO]; //present/dismiss viewcontroller in order to activate rotating. UIViewController *mVC = [[UIViewController alloc] init]; [self presentModalViewController:mVC animated:NO]; [self dismissModalViewControllerAnimated:NO]; 
 if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft ); } 

Aunque esta no es una solución inactiva, funciona bien para mí.

 - (void)viewDidLoad { self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0)); self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); } 

Como se sugiere en un hilo relacionado shouldAutorotateToInterfaceOrientation está en desuso. Las aplicaciones más nuevas deben aprovechar los siguientes métodos como se describe en la Referencia de clase UIViewController de Apple hasta que ellos mismos se vuelvan obsoletos:

  • shouldAutorotate ,
  • preferredInterfaceOrientationForPresentation ; y
  • attemptRotationToDeviceOrientation .

Por lo que entiendo, es mejor usar diferentes Controladores de Vista para las vistas que necesitan ajustarse (es decir, tener un modo de orientación preferido) que difiere de la última.