来回选择时锁定的ViewController方向断开

时间:2018-08-11 21:59:59

标签: ios swift orientation appdelegate

我有一个简单的相机应用。 Camera Preview屏幕是一个视图控制器(名称为ViewController),我通过它锁定了方向 该代码(找不到该代码的StackOverflow链接),该viewcontroller嵌入在导航控制器中:

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if let navigationController = self.window?.rootViewController as? UINavigationController {
            if navigationController.visibleViewController is ViewController {
                return UIInterfaceOrientationMask.portrait
            } else {
                return UIInterfaceOrientationMask.all
            }
        }
        return UIInterfaceOrientationMask.portrait
    }

相机启动时,“相机预览”锁定为.portrait方向,这正是我所希望的。 但是,如果我按下媒体库按钮,将我引导到另一个屏幕, 并通过旋转我的物理设备来更改库屏幕的方向,然后通过“后退”按钮返回到我的“摄像机预览”屏幕,方向将被破坏。它是横向模式,而不是纵向模式。 如何获得硬锁?

以防万一,我在这里创建了一个虚拟的代码模型(时间太长,无法在此处发布),你们可以在这里自己进行测试

https://github.com/bigmit2011/Testing-Camera

编辑:

如果应用程序崩溃,请尝试再运行一次。 由于某种原因,应用程序首次运行时会崩溃。谢谢。

EDIT2:

尝试将嵌入式ViewController设置为UINavigationController的委托。 但是,我不太了解我是否做得正确:

class ViewController: UIViewController, UINavigationControllerDelegate {

    var navigation: UINavigationController?
    self.navigation.delegate = self  // doesn't seem to work


    func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {

        return .portrait
    }

我需要为UiNavigationController创建一个单独的swift文件吗?

EDIT3: 遵循Matt的回答代码如下:

class CameraViewController :UIViewController, UINavigationControllerDelegate {

override func viewDidLoad() {

    self.navigationController?.delegate = self
    super.viewDidLoad()

func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {

        return .portrait
    }

但是,这似乎将所有内容锁定为纵向模式,而不仅仅是将其内嵌在Navigation Controller中。

2 个答案:

答案 0 :(得分:2)

您犯了两个错误。

  • 首先,您尝试从应用程序委托中控制各个视图控制器的方向。错了应用程序委托人控制整个 应用程序的可能方向的总数。但是对于视图控制器,每个单独的视图控制器都控制其 own 方向。只需在您的两个视图控制器(而不是应用程序委托)中的每个中实现supportedInterfaceOrientations

  • 第二,您的第一个视图控制器在导航界面中。因此,它不是顶级视图控制器,也不能直接控制方向(使用supportedInterfaceOrientations)。控制导航界面方向的正确方法是将自己设置为导航控制器的 delegate 并实现navigationControllerSupportedInterfaceOrientations(_:)

答案 1 :(得分:1)

我也无法运行您的应用。但是我用主VC,第二VC在Xcode中对此进行了测试,并将主VC嵌入到导航控制器中。然后,我按照本文Selective rotation lock in iOS

中的建议进行操作

您将以下内容添加到AppDelegate:

switch(yn){
    case true: 
        console.log('Ok...'); 
}

然后在允许allButUpsideDown的VC中(或将其更改为所需的内容),添加以下代码:

var enableAllOrientation = false

func application(_ application: UIApplication,supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if (enableAllOrientation == true){
    return UIInterfaceOrientationMask.allButUpsideDown
}
return UIInterfaceOrientationMask.portrait
}

我把它放在第二个VC中。在模拟器中运行该应用程序,将其锁定到第二个VC,将方向更改为横向,然后放回原处,然后将主VC锁定为纵向。