我有如下配置:

UINavigationController
    -> ViewController

其中ViewController是导航控制器的根视图控制器。
ViewController可以模态呈现另一个视图控制器ModalViewController,如下所示。
self.presentViewController(modalViewController, animated: true, completion: nil)

ModalViewController中,我重写了以下方法。实际上,模态视图控制器只能以Landscape模式显示。
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return .Landscape
}

然后,我重写ViewController的方法来响应方向更改。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    print("Size is \(size)")
}

我注意到的是,如果提供了模态视图控制器,则仅当print处于ViewController模式时才记录ModalViewController中的Landscape,而没有在Portrait中进行记录。换句话说,当我旋转设备时,ModalViewController应该只能显示Landscape方向。在后台,即使ViewController不可见(并且设备在Portrait中),该控制器也应该能够响应大小更改。情况并非如此,因为我看不到print日志。

用例:

如果ModalViewController不可见,则为打印日志
Size is (1024.0, 768.0)
Size is (768.0, 1024.0)
Size is (1024.0, 768.0)
Size is (768.0, 1024.0)

ModalViewController模态显示时
Size is (1024.0, 768.0)
Size is (1024.0, 768.0)

这是正确的行为吗?我的目标是即使设备处于纵向模式(打开ViewController时)也响应ModalViewController的方向更改。有什么线索吗?

编辑

基于 matt 注释。

如果ViewController不是最前面的视图控制器,则它没有“响应方向更改”的业务。您只是偶然发现了您不应该感兴趣的实现细节或边缘情况。
ViewController是充当父视图控制器的复杂控制器。它有两个孩子:PortraitViewControllerLandscapeViewController。这些控制器以viewWillTransitionToSize方法交换。每当ModalViewController不可见(未显示)时,交换均以正确的方式进行。相反,当显示ModalViewController时,交换仅针对Landscape模式运行(请参见上面的日志)。

最佳答案

在我看来,似乎您只是在错误的时间尝试做某事。当模式视图控制器被关闭并且您的视图控制器的视图将重新出现时,您将收到大量警告(包括appearlayout事件),并且您可以根据当前方向做任何需要做的事情,然后视图才可见给用户。

关于ios - 有关在UIViewController中管理方向的说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38402839/

10-09 06:29