如何强制或禁用一些但不是所有的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
以获得所需的效果。
尝试添加此方法与shouldAutorotate
和supportedInterfaceOrientations
- (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/