繁体   English   中英

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

[英]Locked ViewController orientation breaking when segueing back and forth

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

 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中的单个viewController。

您正在犯两个错误。

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

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

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

您将以下内容添加到AppDelegate:

var enableAllOrientation = false

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

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

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.enableAllOrientation = true
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.enableAllOrientation = false

let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM