IOS 6强制设备方向为横向

我给了一个应用程序说10视图控制器。 我使用导航控制器加载/卸载它们。

除了一个以外,都是以肖像模式。 假设第七个VC在横向。 当它被加载时,我需要它在横向上呈现。

请build议一种方法来强制在iOS 6中从纵向到横向的方向 (在IOS 5中工作也是一件好事)。

这是我 IOS 6 之前的工作方式

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; UIViewController *c = [[[UIViewController alloc]init] autorelease]; [self presentModalViewController:c animated:NO]; [self dismissModalViewControllerAnimated:NO]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return (interfaceOrientation == UIInterfaceOrientationPortrait); } 

呈现和解散模式风险投资者迫使应用程序审查其方向,所以shouldAutorotateToInterfaceOrientation被调用。

我已经在iOS 6中尝试过了:

 - (BOOL)shouldAutorotate{ return YES; } -(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ return UIInterfaceOrientationLandscapeLeft; } 

在加载时,控制器保持纵向。 旋转设备后,方向改变就好了。 但是我需要让控制器自动旋转到负载上的横向,这样用户就不得不旋转设备才能看到正确的数据。

另一个问题:将设备旋转到纵向后,方向转到纵向,尽pipe我只在supportedInterfaceOrientations指定了UIInterfaceOrientationMaskLandscape 。 为什么会发生?

另外,上面3个方法中的NONE都被调用。

一些(有用的)数据:

  1. 在我的plist文件中,我指定了3个方向 – 除了颠倒以外。
  2. 这个项目是在Xcode 4.3 IOS 5中启动的。所有类,包括Xib都是在Xcode 4.5 IOS 6之前创build的,现在我使用的是最后一个版本。
  3. 在plist文件中,状态栏被设置为可见。
  4. 在xib文件(我想要在横向中)状态栏是“无”,方向设置为横向。

任何帮助表示赞赏。 谢谢。

好的,伙计们,我会发布我的解决scheme。

我拥有的:

  1. 基于视图的应用程序,带有几个视图控制器。 (这是基于导航的,但由于定位问题,我不得不使其基于视图)。
  2. 所有的视图控制器是肖像,除了一个 – landscapeLeft。

任务:

  1. 无论用户拿着设备如何,我的一个视图控制器都必须自动旋转到横向。 所有其他控制器必须是纵向的,在离开横向控制器之后,应用程序必须强制旋转到纵向,而不pipe使用者如何握住该装置。
  2. 这必须像在IOS 5.x上一样在IOS 6.x上工作

走!

更新删除@IvanVučicabuild议的macros)

在你所有的PORTRAIT视图控制器中都会覆盖像这样的自动旋转方法:

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

你可以看到两种方法:一种是IOS 5,另一种是IOS 6。

对于您的LANDSCAPE视图控制器也是一样的,有一些添加和更改:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ [image_signature setImage:[self resizeImage:image_signature.image]]; return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft); } -(BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { [image_signature setImage:[self resizeImage:image_signature.image]]; return UIInterfaceOrientationMaskLandscapeLeft; } 

注意 :要强制在IOS 5自动旋转,你应该添加这个:

 - (void)viewDidLoad{ [super viewDidLoad]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0) [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; } 

类似地,在你离开LANDSCAPE控制器之后,无论你加载什么控制器,你都应该再强制自动旋转IOS 5,但现在你将使用UIDeviceOrientationPortrait ,当你去一个PORTRAIT控制器:

 - (void)viewDidLoad{ [super viewDidLoad]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0) [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO]; } 

现在最后一件事(有点奇怪) – 你必须改变你从一个控制器切换到另一个,取决于IOS:

创build一个NSObject类“Schalter”(德语为“Switch”)。

在Schalter.h中说:

 #import <Foundation/Foundation.h> @interface Schalter : NSObject + (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease; @end 

在Schalter.m说:

 #import "Schalter.h" #import "AppDelegate.h" @implementation Schalter + (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease{ //adjust the frame of the new controller CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; CGRect windowFrame = [[UIScreen mainScreen] bounds]; CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height); VControllerToLoad.view.frame = firstViewFrame; //check version and go if (IOS_OLDER_THAN_6) [((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view]; else [((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad]; //kill the previous view controller [VControllerToRelease.view removeFromSuperview]; } @end 

现在,这是你使用Schalter的方式(假设你从Warehouse控制器到Products控制器):

 #import "Warehouse.h" #import "Products.h" @implementation Warehouse Products *instance_to_products; - (void)goToProducts{ instance_to_products = [[Products alloc] init]; [Schalter loadController:instance_to_products andRelease:self]; } bla-bla-bla your methods @end 

当然,你必须释放instance_to_products对象:

 - (void)dealloc{ [instance_to_products release]; [super dealloc]; } 

那么,就是这样。 不要犹豫,downvote,我不在乎。 这是为那些正在寻找解决scheme的人,而不是为了声誉。 干杯! Sava Mazare。

这应该工作,它是类似于iOS 6以前的版本,但是有一个UINavigationController

 UIViewController *portraitViewController = [[UIViewController alloc] init]; UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController]; [self.navigationController presentModalViewController:nc animated:NO]; [self.navigationController dismissModalViewControllerAnimated:NO]; 

我在推送下一个UIViewController之前调用它。 即使当前的UIViewController处于横向模式下,也会强制下一个推送的UIViewController以纵向模式显示(应该也适用于纵向横向模式)。 适用于iOS 4 + 5 + 6。

我认为最好的解决办法是坚持官方的苹果文件。 所以根据我使用以下方法,一切都在iOS 5和6上运行得非常好。在我的VC我重写下面的方法:

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

iOS 6的方法,第一个方法返回支持的方向掩码(如他们的名字所示)

 -(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; } 

第二个这是告诉你的VC哪个VC是要显示的首选接口方向。

 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } 

只是改变肖像的方向,你想要的;)这个解决scheme工作顺利,我不喜欢创buildmacros和其他东西的想法,围绕这个简单的解决scheme。 希望这个帮助…

我有同样的问题,在我的应用程序中从26个肖像,只有一个在所有的方向(图像浏览器:) 27个视图。 在每个class上添加macros并replace导航并不是我所熟悉的解决scheme。

所以,我想保持UINavigationController机制在我的应用程序,而不是用其他代码取代。

该怎么办:

@ 1在方法didFinishLaunchingWithOptions中的应用程序委托中

 if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0) { // how the view was configured before IOS6 [self.window addSubview: navigationController.view]; [self.window makeKeyAndVisible]; } else { // this is the code that will start the interface to rotate once again [self.window setRootViewController: self.navigationController]; } 

@ 2因为navigationController只会响应YES进行自动转换,所以我们需要添加一些限制:扩展UINavicationController – > YourNavigationController并将其链接到Interface Builder中。

@ 3覆盖导航控制器的“anoying新方法”。

由于这个类是只为这个应用程序定制,它可以承担责任,它的控制器,并在他们的位置作出响应。

 -(BOOL)shouldAutorotate { if ([self.viewControllers firstObject] == YourObject) { return YES; } return NO; } - (NSUInteger)supportedInterfaceOrientations { if ([self.viewControllers firstObject] == YourObject) { return UIINterfaceOrientationMaskLandscape; } return UIInterfaceOrientationMaskPortrait; } 

我希望这会帮助你,

从iOS 6发行说明 :

现在,iOS容器(如UINavigationController)不会咨询他们的孩子,以确定他们是否应该自动旋转。

您的rootViewController是否将ViewController层次结构中的rootViewController消息传递给您的VC?

我使用了与OP pre-ios6相同的方法(呈现和解除模态VC),以横向模式显示单个视图控制器(所有其他模式)。 它用ios6打破了风景VC的肖像。

为了解决这个问题,我只在landscape VC中添加了preferredInterfaceOrientationForPresentation方法。 似乎现在正常工作os 5和os 6。

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft); } - (BOOL)shouldAutorotate { return NO; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft; } 

嘿家伙尝试了很多不同的可能的解决scheme,但没有成功,我拿出下面的解决scheme希望它有帮助!

我准备了一个配方:)。

问题:您需要在ios 6中使用navigationcontroller更改viewcontrollers的方向。

解:

导航建议

第1步。一个初始的UIviewcontroler触发模式赛格风景和肖像UInavigationControllers如图所示….

在UIViewController1更深入,我们需要根据Appdelegate的全局variables2 segues动作….

 -(void)viewDidAppear:(BOOL)animated{ if([globalDelegate changeOrientation]==0){ [self performSegueWithIdentifier:@"p" sender:self]; } else{ [self performSegueWithIdentifier:@"l" sender:self]; } } 

我们也需要回到肖像&|的方式 景观….

 - (IBAction)dimis:(id)sender { [globalDelegate setChangeOrientation:0]; [self dismissViewControllerAnimated:NO completion:nil]; } 

第2步。每个NavigationController的第一个推UiViewController与…

 -(NSUInteger)supportedInterfaceOrientations{ return [self.navigationController supportedInterfaceOrientations]; } -(BOOL)shouldAutorotate{ return YES; } 

第3步。我们覆盖UInavigationController的子类supportedInterfaceOrientations方法….

在你的customNavigationController中我们有…..

 -(NSUInteger)supportedInterfaceOrientations{ if([self.visibleViewController isKindOfClass:[ViewController2 class]]){ return UIInterfaceOrientationMaskPortrait; } else{ return UIInterfaceOrientationMaskLandscape; } } 

第4步。在故事板或代码中,将wantFullScreenLayout标志设置为yes,以便纵向和横向uinavigationcontrollers。

尝试继续使用UINavigationController ,它使用一个类别或子types来指定所需的方向,然后继续所需的VC。 在这里阅读更多。

作为替代scheme,您可以使用相同的方法来执

 UIViewController *viewController = [[UIViewController alloc] init]; viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentViewController:viewController animated:NO completion:^{ [self dismissViewControllerAnimated:NO completion:nil]; }]; 

另外,在推新视图之前调用它。

转到Info.plist文件并进行更改 在这里输入图像描述

我有同样的问题。 如果你想强制一个特定的视图控制器出现在横向上,那么在把它推入导航堆栈之前就要做。

 UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; if (currentOrientation == UIInterfaceOrientationPortrait || currentOrientation == UIInterfaceOrientationPortraitUpsideDown) [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft]; UIViewController *vc = [[UIViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; [vc release]; 

我通过inheritanceUINavigationController并覆盖导航控制器的supportedInterfaceOrientations来解决它,如下所示:

 - (NSUInteger)supportedInterfaceOrientations { return [[self topViewController] supportedInterfaceOrientations]; } 

所有的控制器实现supportedInterfaceOrientations与他们所需的方向。

我已经使用了以下解决scheme。 在一个视图控制器有一个不同的方向比其他所有的方向,我在prepareForSegue方法中添加了方向检查。 如果目标视图控制器需要与当前显示控件不同的界面方向,则会发送一条消息,强制界面在seque期间旋转。

 #import <objc/message.h> 

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if(UIDeviceOrientationIsLandscape(self.interfaceOrientation)) { UIInterfaceOrientation destinationOrientation; if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) { UINavigationController *navController = (UINavigationController *)[segue destinationViewController]; destinationOrientation = [navController.topViewController preferredInterfaceOrientationForPresentation]; } else { destinationOrientation = [[segue destinationViewController] preferredInterfaceOrientationForPresentation]; } if ( destinationOrientation == UIInterfaceOrientationPortrait ) { if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait ); } } } }