¿Cómo abrir un controller de vista en modo horizontal?

Tengo una vista de tabla y cuando la celda se toca en la tabla, estoy presionando a otro controller de vista de la siguiente manera:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; PriceChart *vc = [storyboard instantiateViewControllerWithIdentifier:@"pricechart"]; [self.navigationController pushViewController:vc animated:YES]; } 

Ahora mi pregunta es: el controller de vista que voy a mostrar debería estar en modo de recorte de tierra, pero está en modo vertical.

Otra pregunta es cómo abrir diferentes controlleres de vista cuando se toca una celda diferente. Lo intenté usando indexpath.row pero ¿hay alguna otra manera de usar storyboard ?

Así es como puedes forzar al paisaje.

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } -(BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

En class que está en modo horizontal:

 - (NSUInteger)supportedInterfaceOrientations { // return orientation that you want //return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return YES; //return UIInterfaceOrientationIsPortrait(toInterfaceOrientation); } 

Si utiliza UINavigationController, debe henetworkingar su control de navigation de UINavigationController e implementar

 - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return [[self.viewControllers lastObject] shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; } 

Intente esto … Esta demostración ha resuelto mi problema …

https://github.com/alloy/ForceOrientationTest

Puede forzar una actualización de orientación como se explica aquí y las otras respuestas en esa pregunta.

En cuanto a la segunda pregunta, simplemente UITableViewController un UITableViewController con celdas estáticas o celdas prototipo dinámicas. Luego, controle + arrastre desde la celda a otro controller de vista en su Storyboard. Tendrás las mismas acciones Push / Modal / Custom que aparecen para los botones.

 shouldAutorotate, supportedInterfaceOrientations, prefernetworkingInterfaceOrientationForPresentation 

Los methods anteriores no se llaman de un UIViewController si están dentro de un UINavigationController . Si estos methods se declaran dentro del UINavigationController , se los llamará.

Para resolver esto, haga una class que le llamemos OrientationEnabledNavigation , es una subclass de UINavigationController . Luego implementado shouldAutorotate, supportedInterfaceOrientations, prefernetworkingInterfaceOrientationForPresentation Métodos de OrientationEnabledNavigation shouldAutorotate, supportedInterfaceOrientations, prefernetworkingInterfaceOrientationForPresentation dentro de OrientationEnabledNavigation .

OrientationEnabledNavigation.h

 #import <UIKit/UIKit.h> @interface OrientationEnabledNavigation : UINavigationController @end 

OrientationEnabledNavigation.m

 #import "OrientationEnabledNavigation.h" @interface OrientationEnabledNavigation () @end @implementation OrientationEnabledNavigation - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (BOOL)shouldAutorotate { return [self.topViewController shouldAutorotate]; // return NO; } - (NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return [self.topViewController prefernetworkingInterfaceOrientationForPresentation]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

Luego, si desea utilizar el controller de navigation en su proyecto, use OrientationEnabledNavigation . Después de eso, si implementas shouldAutorotate, supportedInterfaceOrientations, prefernetworkingInterfaceOrientationForPresentation este método dentro de tu viewcontroller, se llamará.

El in viewcontroller implementa estos:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } -(BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

Otra forma es agregar un código inicial al delegado de la aplicación:

Para UITabBarController

 @implementation UITabBarController (AutoRotationForwarding) -(BOOL)shouldAutorotate { if ([self.selectedViewController respondsToSelector:@selector(shouldAutorotate)]) { return [self.selectedViewController shouldAutorotate]; } else { return YES; } } - (NSUInteger)supportedInterfaceOrientations { if ([self.selectedViewController respondsToSelector:@selector(supportedInterfaceOrientations)]) { return [self.selectedViewController supportedInterfaceOrientations]; } else { return UIInterfaceOrientationMaskAll; } } @end 

Para UINavigationController

 @implementation UINavigationController (AutoRotationForwarding) -(BOOL)shouldAutorotate { if ([self.topViewController respondsToSelector:@selector(shouldAutorotate)]) { return [self.topViewController shouldAutorotate]; } else { return YES; } } -(NSUInteger) supportedInterfaceOrientations { if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)]) { return [self.topViewController supportedInterfaceOrientations]; } return UIInterfaceOrientationMaskPortrait; } @end 

Espero que esto ayude.. 🙂