我有如下配置:
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
的方向更改,即使(当ViewController
打开时)设备处于纵向模式。任何线索?
修改
基于 matt 评论。
如果ViewController不是最前面的视图控制器,它没有业务“响应方向更改”。您只是偶然发现了一个您不感兴趣的实现细节或边缘情况。
PortraitViewController
是一个复杂的控制器,充当父视图控制器。它有两个孩子:LandscapeViewController
和viewWillTransitionToSize
。这些控制器以ModalViewController
方法交换。只要ModalViewController
不可见(未显示),交换就会以正确的方式工作。相反,当出现Landscape
时,交换仅针对{{1}}模式运行(参见上面的日志)。
答案 0 :(得分:1)
听起来好像你只是想在错误的时间做某事。当模态视图控制器被解除并且您的视图控制器视图即将重新出现时,您将收到大量警告(包括appear
和layout
事件)并且您可以执行任何操作在您的视图对用户可见之前,需要根据当前方向进行操作。