【问题标题】:Locked ViewController orientation breaking when segueing back and forth来回切换时锁定的 ViewController 方向中断
【发布时间】:2018-08-11 21:59:58
【问题描述】:

我有一个简单的相机应用程序。 相机预览屏幕是一个视图控制器(名称 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

编辑:

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

编辑2:

试图将嵌入式 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 文件吗?

编辑3: 按照马特的回答代码如下:

class CameraViewController :UIViewController, UINavigationControllerDelegate {

override func viewDidLoad() {

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

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

        return .portrait
    }

但是,这似乎将所有内容锁定为纵向模式,而不仅仅是嵌入在导航控制器中的单个 viewController。

【问题讨论】:

  • 你的项目崩溃了
  • @Vyacheslav 请尝试再运行一次。由于某种原因,第一次运行应用程序时它会崩溃。谢谢。

标签: ios swift orientation appdelegate


【解决方案1】:

你犯了两个错误。

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

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

【讨论】:

【解决方案2】:

我也无法运行您的应用。但我在 Xcode 中使用主 VC、第二个 VC 进行了测试,并将主 VC 嵌入到导航控制器中。然后我按照这篇文章中的建议Selective rotation lock in 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 被锁定为纵向。

【讨论】:

  • 谢谢。当您说“然后在允许 allButUpsideDown 的应用程序中(或将其更改为您想要的)时,您添加以下代码”,您的意思是视图控制器而不是“应用程序”。这是否意味着我必须添加我不想锁定的每个视图控制器?要去测试一下。至于应用程序崩溃,它总是第一次崩溃,但第二次通常没问题。这是我最终必须解决的另一个错误。
  • 很好地抓住了需要成为“VC”的“应用程序”。我编辑了这个。而且,是的,您需要将此代码添加到每个违反应用程序委托设置的 VC(在此示例中,对于所有方向都是错误的,并且仅设置为纵向)
  • 这很好用。我刚刚将var enableAllOrientation = false 切换为true,所以我只需要更改一个视图控制器。
猜你喜欢
  • 2012-12-19
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多