我使用 swift 为iPhone创建了一个应用程序,它由嵌入在导航控制器中的许多视图组成 . 我想将主视图锁定为纵向方向,并且仅锁定横向方向的导航控制器的子视图 . 这是我的意思的一个例子:
-
UINavigationController
-
UiViewController1(纵向锁定)初始视图控制器,导航栏上有一个按钮,可以让用户访问可以选择其他视图的列表
-
UIViewController2(景观锁定)
-
UiViewController3(人像与风景)
-
UiViewController4(人像与风景)
-
......
-
......
我怎样才能做到这一点?
12 回答
根据Swift Apple Docs for
supportedInterfaceOrientations
:您的导航控制器应覆盖
shouldAutorotate
和supportedInterfaceOrientations
,如下所示 . 为了方便起见,我在UINavigationController
扩展中执行了此操作:而你的主视图控制器(任何时候都是肖像)应该具有:
然后,在您要支持纵向或横向的子视图控制器中:
编辑:针对iOS 9更新:-)
也回答[here]
当您拥有复杂的视图层次结构时,例如拥有多个导航控制器和/或选项卡视图控制器,事情就会变得非常混乱 .
此实现将其置于各个视图控制器上以设置何时锁定方向,而不是依靠App Delegate通过迭代子视图或依赖继承来查找它们 .
Swift 3
在AppDelegate中:
在其他一些全局struct或helper类中,我在这里创建了AppUtility:
然后在所需的ViewController中,您想要锁定方向:
如果您的视图嵌入在storyboard中的navigationcontroller中,则导航控制器委托
UINavigationControllerDelegate
并添加以下方法更新:如果您在
iOS 10
中启动应用后无法立即设置方向,请尝试在ObjC
而不是Swift
中使用,并使用class MyNavigationController: MyNavigationControllerBase
:斯威夫特3:
Swift 4 中的 JasonJasonJason 回答(它与 iOS 11 一起正常工作)
1- Override shouldAutorotate and supportedInterfaceOrientations as shown below.
2- And your main viewcontroller (portrait at all times), should have:
3- Then, in your subviewcontrollers that you want to support portrait or landscape:
重要的想法是在AppDelegate中描述整个应用程序支持的接口方向 . 例如,要将所有视图阻止为纵向,只需执行以下操作:
很多人都在寻找这个答案谷歌搜索这个问题,所以我希望你能原谅我 .
适用于Swift 3.0
在你想要肖像的主控制器中,
在subVC中你想要使用Landscape
或者您可以覆盖此方法
这就是我在iOS7中使用Obj-c的方式,我认为这段代码也适用于iOS8
这是Swift更新: -
编辑swift2.0:
这是Swift 3(XCode 8.2 beta)的语法,其中这些方法转换为属性:
您必须将此应用于顶视图控制器 . 但是,您可以通过子类化顶视图控制器并在其中设置一个变量来以干净/简单的方式执行此操作,以便在每次调用时引用:
当设备检测到方向更改并在调用之前调用时调用:
例如,假设我的顶视图控制器是TabBarController:
}
然后在应该具有旋转屏幕能力的视图内,设置viewWillAppear()和viewWillDisappear(),如下所示:
如果你的应用程序在这个屏幕上崩溃,那么在viewWillLoad()方法中为每个视图显式设置shouldRotate:Bool值可能是个好主意 .
在iOS8中,如果要锁定某些特定的ViewController,请创建UINavigationController的扩展(在您使用它的情况下):