关于在UIViewController中管理方向的说明

时间:2016-07-15 18:24:48

标签: ios objective-c swift uiviewcontroller orientation

我有如下配置:

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是一个复杂的控制器,充当父视图控制器。它有两个孩子:LandscapeViewControllerviewWillTransitionToSize。这些控制器以ModalViewController方法交换。只要ModalViewController不可见(未显示),交换就会以正确的方式工作。相反,当出现Landscape时,交换仅针对{{1}}模式运行(参见上面的日志)。

1 个答案:

答案 0 :(得分:1)

听起来好像你只是想在错误的时间做某事。当模态视图控制器被解除并且您的视图控制器视图即将重新出现时,您将收到大量警告(包括appearlayout事件)并且您可以执行任何操作在您的视图对用户可见之前,需要根据当前方向进行操作。