[英]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.