【问题标题】:How to "force" a view to be shown in portrait when it is loaded/shown with the device in landscape?当设备以横向加载/显示时,如何“强制”以纵向显示视图?
【发布时间】:2016-03-13 02:54:15
【问题描述】:

我支持我的 iOS 应用程序中的所有方向和自动旋转,但我希望某些视图控制器不要在横向中显示它们的视图。我在这样的视图控制器中实现shouldAutorotate 方法:

- (BOOL)shouldAutorotate
{
   return NO;
}

当它被加载或以纵向出现时,它肯定会阻止视图被旋转到横向。但是当视图控制器被加载或者它看起来已经是横向的设备时,视图会以横向显示。

无论设备的方向如何,我如何加载/使视图从一开始就以纵向显示?

谢谢

【问题讨论】:

标签: ios uiview uiviewcontroller orientation autorotate


【解决方案1】:

您可以使用方法supportedInterfaceOrientations() 来指定特定视图控制器的可用方向。

但是,当您将视图控制器嵌入导航堆栈时,系统会在导航控制器上调用 shouldAutorotatesupportedInterfaceOrientations,并且从视图控制器返回的值将被忽略。

我使用UINavigationController 的子类来从顶视图控制器获取支持的方向。你也可以为UITabBarViewController创建这样一个类

class SingleOrientationNavigationController: UINavigationController {

    //MARK : Orientation
    override func shouldAutorotate() -> Bool {
        if let topVC = topViewController {
            return topVC.shouldAutorotate()
        }
        return false
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if let topVC = topViewController {
            return topVC.supportedInterfaceOrientations()
        }
        return UIInterfaceOrientationMask.Portrait
    }

    // MARK : Status bar
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        if let topVC = topViewController {
            return topVC.preferredStatusBarStyle()
        }
        return .Default
    }
}

请注意,如果推送的视图控制器的旋转选项比前一个少,您可能会遇到一些问题。

让我们考虑两个视图控制器:

A : only portrait
B : all orientation

如果从A推到B,那就没问题了,B可以随意旋转,即使B是横向的,当它弹出时,你也会纵向回到A。

但是如果在 B 处于横向状态时从 B 向 A 执行推送,那么 A 也将显示为横向!一种解决方法是在这种特殊情况下使用模态视图控制器而不是推送它。

【讨论】:

  • 谢谢。我进行了一些测试,但无法在 iPhone 6 Plus 上进行这项工作......你知道这些设备是否需要一些额外的设置吗?
【解决方案2】:

可以通过在您的应用程序的.plist 中添加Initial interface orientation = Portrait (bottom home button) 来完成。

【讨论】:

  • 谢谢。但这可能会影响整个应用程序,我只想在某些视图中使用这种行为
  • 应用加载时,会纵向显示。所以你不想旋转的视图可以使用函数-(NSUInteger)supportedInterfaceOrientations- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  • 谢谢。我正在测试 .plist 文件中的设置,它似乎在 iPhone 6 Plus 中不起作用,我正在以横向方式启动应用程序,并且视图以横向方式显示,甚至是启动图像...