在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)") }
我注意到,如果提供了模式视图控制器, ViewController
的print
仅在ModalViewController
处于Landscape
模式时才被logging,而未在Portrait
logging。 换句话说,当我旋转设备时, 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
是一个复杂的控制器,充当父视图控制器。 它有两个孩子: PortraitViewController
和LandscapeViewController
。 这些控制器交换在viewWillTransitionToSize
方法。 每当ModalViewController
不可见(不显示),交换以正确的方式工作。 相反,当ModalViewController
出现时,交换只为Landscape
模式运行(参见上面的日志)。
这听起来好像你只是想在错误的时间做点什么。 当模式视图控制器被解散,你的视图控制器的视图即将重新出现,你会得到很多的警告(包括appear
和layout
事件),你可以做任何需要做的,基于当前的方向,在视图变得可见给用户。