我有如下配置:
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
是充当父视图控制器的复杂控制器。它有两个孩子:PortraitViewController
和LandscapeViewController
。这些控制器以viewWillTransitionToSize
方法交换。每当ModalViewController
不可见(未显示)时,交换均以正确的方式进行。相反,当显示ModalViewController
时,交换仅针对Landscape
模式运行(请参见上面的日志)。 最佳答案
在我看来,似乎您只是在错误的时间尝试做某事。当模式视图控制器被关闭并且您的视图控制器的视图将重新出现时,您将收到大量警告(包括appear
和layout
事件),并且您可以根据当前方向做任何需要做的事情,然后视图才可见给用户。
关于ios - 有关在UIViewController中管理方向的说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38402839/