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

时间:2015-08-01 05:46:57

标签: ios objective-c iphone ipad rotation

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

第一

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

但屏幕仍然会旋转到横向。

第二 我创建了一个自定义视图控制器类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

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

我使用的是iOS 8&amp;不希望viewcontroller以横向模式旋转吗?

修改 是否可以仅为某些视图控制器设置横向方向,并强制其他视图控制器方向粘贴到纵向?

9 个答案:

答案 0 :(得分:7)

尝试继承您正在使用的UINavigationController,因为默认UINavigationController不会将shouldAutorotate方法转发给您的viewcontroller。

UINavigationController子类

中实施以下方法
- (BOOL)shouldAutorotate
{
    return [self.visibleViewController shouldAutorotate];
}

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

答案 1 :(得分:5)

您的PortraitViewController没问题,我不知道您的Storyboard配置。在您的情况下,重要的是您应该将目标视图控制器嵌入到另一个新的导航控制器中,然后将它的类设置为您的PortraitViewController并以模态方式呈现该导航,就像我在下面的图像中所做的那样并且它按预期工作。

enter image description here

If you want to show animation that will make presentation animation like push 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

答案 2 :(得分:5)

尝试将此方法与shouldAutorotatesupportedInterfaceOrientations

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

}

此外,您可以使用此[UIViewController attemptRotationToDeviceOrientation]以便它旋转到所需的新方向

答案 3 :(得分:3)

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

#import "UINavigationController+Orientation.h"

 @implementation UINavigationController (Orientation)

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

-(BOOL)shouldAutorotate
 {
    return YES;
 }

@end  

当您嵌入UINavigationController时,容器不会询问他们的孩子是否要旋转

答案 4 :(得分:1)

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

- (BOOL)shouldAutorotate
{
    return NO;
}

答案 5 :(得分:1)

在视图控制器中查看此内容

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationPortrait |
           UIInterfaceOrientationPortraitUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}

答案 6 :(得分:1)

1)在AppDelegate中创建一个bool变量。

2)然后复制&amp;粘贴到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)现在复制&amp;粘贴到要强制定位的视图控制器的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)现在在推送这个视图控制器之前,你需要先设置bool。所以,让我们说你想推ABC视图控制器

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

希望这会有所帮助!!

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

因此,您需要子类化&#39; UINavigationController&#39;,实现shouldAutorotate并在故事板中使用导航控制器类。

- (BOOL)shouldAutorotate

{

id currentViewController = self.topViewController;


 if ([currentViewController isKindOfClass:[DetailViewController class]])
    return NO;

return YES;

}

可以在

上找到替代方法

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