如何强制或禁用一些但不是所有的UIViewController的界面方向?

我有一个9-10屏幕的应用程序。 我embedded一个UINavigationController到我的视图控制器。 我有几个视图控制器,我只想设置纵向:这意味着旋转设备不应该将这些视图控制器旋转到横向模式。 我已经尝试了以下解决scheme:

第一:

  NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 

但屏幕仍然旋转到风景。

第二:我创build了一个自定义的视图控制器类作为PortraitViewController并在下面的代码中添加了PortraitViewController.m

 @interface PortraitViewController () @end @implementation PortraitViewController - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { //Here check class name and then return type of orientation return UIInterfaceOrientationMaskPortrait; } @end 

之后,我实现了PortraitViewController.h作为基类

 #import <UIKit/UIKit.h> #import "PortraitViewController.h" @interface Login : PortraitViewController @end 

它根本不工作,仍然允许视图控制器以横向模式旋转。

有没有其他解决scheme,我正在使用iOS 8和不希望viewcontroller在横向模式下旋转?

编辑:是否有可能有景观方向只有一些视图控制器,并强制其他视图控制器方向坚持肖像?

尝试UINavigationController你正在使用的UINavigationController ,因为默认的UINavigationController没有将shouldAutorotate方法转发给你的viewcontroller。

在您的UINavigationController子类中实现以下方法

 - (BOOL)shouldAutorotate { return [self.visibleViewController shouldAutorotate]; } 

现在, UINavigationController将方法调用转发给当前可见的UIViewController因此您需要单独实现shouldAutorotate以获得所需的效果。

尝试添加此方法与shouldAutorotatesupportedInterfaceOrientations

 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { //Setting the orientation of the view. I've set it to portrait here. return UIInterfaceOrientationPortrait; 

}

你也可以使用这个[UIViewController attemptRotationToDeviceOrientation]以便它旋转到所需的新的方向

你的PortraitViewController是好的,我不知道你的故事板configuration。 在你的情况下,重要的是你应该将目标视图控制器embedded到另一个新的导航控制器中,然后将它的类设置为你的PortraitViewController并以模态方式呈现该导航,就像我在下面的图像中完成的那样,并且按预期工作。

在这里输入图像说明

如果你想显示的animation将使演示animation像推动animation

以下是我的UINavigationController的PortrateNavigation子类

PortrateNavigation.h

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

PortrateNavigation.m

 #import "PortrateNavigation.h" @implementation PortrateNavigation - (void)viewDidLoad { [super viewDidLoad]; } - (BOOL)shouldAutorotate { return YES; } - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } @end 

UINavigationController上创build一个类别并覆盖supportedInterfaceOrientations

 #import "UINavigationController+Orientation.h" @implementation UINavigationController (Orientation) -(NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } -(BOOL)shouldAutorotate { return YES; } @end 

当你embeddedUINavigationController ,容器不会问他们的孩子是否旋转

你必须手动完成。 所有的视图控制器,在那些你不想旋转视图,实现以下方法。

 - (BOOL)shouldAutorotate { return NO; } 

在你的视图控制器中这个

 - (BOOL)shouldAutorotate{ return NO; } - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ return UIInterfaceOrientationPortrait; } 

1)在AppDelegate中创build一个boolvariables。

2)然后在AppDelegate.m中复制并粘贴以下代码(根据您的要求进行修改)

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation) if (self.isLandscape == YES) //bool created in first step { return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; } return UIInterfaceOrientationMaskPortrait; } 

3)现在将下面的代码复制并粘贴到您要强制定向的视图控制器的viewWillAppear方法中。

 [AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement [[UIDevice currentDevice] setValue:value1 forKey:@"orientation"]; 

4)现在在推这个视图控制器之前,你需要先设置布尔。 所以,假设你想推ABC视图控制器

 [AppDelegate sharedAppDelegate].isLandscape = YES; [self.navigationController pushViewController:<ABC view controller instance> animated:NO]; 

希望这可以帮助!!

 class ViewController: UIViewController { override func shouldAutorotate() -> Bool { return false } } 

这里是主题的链接: http : //koreyhinton.com/blog/lock-screen-rotation-in-ios8.html

如果要暂时禁用自动旋转function,请避免操作方向遮罩来执行此操作。 相反,重写初始视图控制器上的shouldAutorotate方法。 在执行任何自转之前调用此方法。 如果它返回NO,那么旋转被抑制。

所以你需要子类“UINavigationController”,实现shouldAutorotate和使用你的导航控制器类的故事板。

 - (BOOL)shouldAutorotate { id currentViewController = self.topViewController; if ([currentViewController isKindOfClass:[DetailViewController class]]) return NO; return YES; 

}

可以find一个替代方法

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/