在UIViewController中pipe理方向的说明

我有一个像下面这样的configuration:

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)") } 

我注意到,如果提供了模式视图控制器, ViewControllerprint仅在ModalViewController处于Landscape模式时才被logging,而未在Portraitlogging。 换句话说,当我旋转设备时, 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不是最前面的视图控制器,它没有“响应方向更改”的业务。 你只是偶然发现了一个你不应该感兴趣的实现细节或边界情况。

ViewController是一个复杂的控制器,充当父视图控制器。 它有两个孩子: PortraitViewControllerLandscapeViewController 。 这些控制器交换在viewWillTransitionToSize方法。 每当ModalViewController不可见(不显示),交换以正确的方式工作。 相反,当ModalViewController出现时,交换只为Landscape模式运行(参见上面的日志)。

这听起来好像你只是想在错误的时间做点什么。 当模式视图控制器被解散,你的视图控制器的视图即将重新出现,你会得到很多的警告(包括appearlayout事件),你可以做任何需要做的,基于当前的方向,在视图变得可见给用户。