我有一个简单的相机应用。 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中。
答案 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锁定为纵向。