如何在iOS中强制视图进入横屏模式?

3

我在SO上看到了许多可能相关的问题,但似乎没有一个是重复的:

如何在viewDidLoad中强制视图旋转为横向?

强制iOS 7横屏

IOS - 如何强制视图为横向

iOS单个视图控制器横屏强制

iOS - 强制横屏方向

如何使应用程序在iOS 6中实现完全正确的自动旋转?

我的应用程序是一个基于选项卡的应用程序。

目前,在进入某些视图时,我可以将我的手机旋转到横向以让我的视图进入横向。

主要代码:

// In app delegate
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (_allowRotation == YES)  {
        return UIInterfaceOrientationMaskLandscape;
    }
    else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

在我想要呈现为横屏的视图中,我将allowRotation设置为YES。
但是我想强制视图进入横屏模式
换句话说,当进入某些视图时,它会自动进入横屏模式,即使用户将屏幕锁定为竖屏也不需要旋转手机。如何实现这一点?
我正在使用iOS 10。

1
你提供了很多链接,但似乎并没有理解它们。强制改变屏幕方向的唯一支持方式是使用一个已呈现的视图控制器。 - matt
4个回答

4

您需要覆盖特定视图的onDidLoad或onDidAppear方法,以使其转换为横向模式。例如,我将其添加到viewWillAppear和Disappear方法中:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    self.navigationController.navigationBarHidden = NO;
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}

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

当视图出现时,应用程序会进入横屏模式,当移动消失时,它会再次回到纵向模式。对于appDelegate,您需要添加以下内容:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    if ([navigationController.viewControllers.lastObject isKindOfClass:[OpencvViewController class]])
    {
        return UIInterfaceOrientationMaskLandscape;
    }
    else
        return UIInterfaceOrientationMaskPortrait;
}

尝试过,但没有成功。这个在iOS 10上应该能工作吗? - zhm
是的,它正在工作!尝试从应用程序参数中停用横向方向。 - mzouink
几点注意事项。您必须使用UIDeviceOrientation*,最好在您的视图控制器呈现之前强制切换方向,也就是在父视图控制器中进行。这样可以使其平稳切换。 - Cynichniy Bandera

1

在你想要切换到横屏模式的特定视图控制器中使用以下代码。

-(void)viewDidLayoutSubviews
{
  NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];

  [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
 }

1

当您需要旋转屏幕方向时,请调用[UIViewController attemptRotationToDeviceOrientation]

您的代码将类似于以下内容:

appDelegate.allowRotation = YES;
[UIViewController attemptRotationToDeviceOrientation];

@MartinZhai,抱歉。让我们澄清一下。例如:您想始终在一侧显示状态栏,但随设备旋转视图? - Cy-4AH
当进入这些视图时(比如全屏视图),我会隐藏状态栏/导航栏/选项卡栏。我想要做的是,通过编程方式触发横向事件,使设备(或我的视图)进入横向模式,而无需用户旋转手机。 - zhm
@MartinZhai 好的,你可以通过调用[UIViewController attemptRotationToDeviceOrientation]来触发它,但在此之前你需要更改supportedInterfaceOrientations - Cy-4AH
我尝试了,但似乎不起作用。在我看来,你的方法是让视图与设备保持相同的方向,对吗?但在我的问题中,设备还没有进入横屏。 - zhm
让我们在聊天中继续这个讨论。点击此处进入聊天室 - zhm
显示剩余2条评论

0

你需要使用

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

window.rootViewController 层次结构中的容器视图控制器或在另一个视图控制器上呈现时。

这将强制您的控制器以横向方向显示。

最简单的示例是将 rootViewController 分配给主窗口。 如果您在视图控制器中使用了 UIInterfaceOrientationMaskLandscape,它从一开始就会以横向方式显示。

如果您尝试将控制器打包到导航控制器中,则需要对后者进行子类化,以定义其中的 UIInterfaceOrientationMaskLandscape,因为它是自己视图控制器的容器。

对于其他具有 parent-child 链接的容器(例如 tabBarController 或您自己的容器),同样适用。

当呈现视图控制器时,您还可以使用另一种方法来修复方向:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

这需要用户旋转手机来触发横屏,我已经做到了。我想在不需要用户旋转手机的情况下进入横屏模式。 - zhm
@MartinZhai,用户不需要旋转设备。如果将此用于作为主窗口的rootViewController的视图控制器,则横向模式将从一开始就保持iPhone处于纵向方向。至于TabBarController作为窗口的rootViewController,应该对其进行子类化以使其按照这种方式工作。 - malex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接