iOS 以 NavigationController 作为根制作,一个控制器仅景观

iOS with NavigationController As Root Make, One Controller ONLY Landscape

我有一个根控制器是 UINavigationController 的应用程序。按下一个按钮,它就会按下另一个视图控制器。再按一次,它会启动一个带有 Overlay 的 AVCaptureSession。我想要那个视图,那个视图只能是风景,而不是肖像。我看了很多不同的教程,但没有任何效果。

我得到的最接近的是:

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

在 viewDidAppear 中。但是,存在一些问题。第一,它立即回到肖像。第二,其他视图仍然可以是纵向和横向,我不希望那样。我需要帮助。

在我的应用委托中,我使用了这段代码并确保只选择了纵向模式:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if ([self.window.rootViewController.presentedViewController isKindOfClass:[SecondViewController class]])
    {
        SecondViewController *secondController = (SecondViewController *) self.window.rootViewController.presentedViewController;

        if (secondController.isPresented)
        {
            return UIInterfaceOrientationMaskLandscape;
        }
        else return UIInterfaceOrientationMaskPortrait;
    }
    else return UIInterfaceOrientationMaskPortrait;
}

是的,您可以通过在您的 appDelegate 中放置波纹管方法来将特定的 viewController 作为景观。

-(NSUInteger)application:(UIApplication *)application    supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
    return UIInterfaceOrientationMaskPortrait;
else
    return UIInterfaceOrientationMaskAll;
}

然后在你的 appDelegate

中取一个 bool 属性
@property (nonatomic) BOOL restrictRotation; 

然后在您想要更改方向的视图控制器中创建 appDelegate 共享实例并允许像下面的方法那样更改限制

-(void) restrictRotation:(BOOL) restriction
{
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = restriction;
} 

现在从您的视图控制器调用此方法并根据需要更改方向。

[self restrictRotation:NO];

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

最重要的是当您的视图消失时将方向更改为纵向,否则所有其他 viewController 也会变成横向模式。

-(void)viewWillDisappear:(BOOL)animated
{
    NSNumber *value = [NSNumber     numberWithInt:UIDeviceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    [self restrictRotation:YES];
} 

希望对您有所帮助。