嗨我正在尝试在主视图的小视图中添加子视图控制器的视图 但是didRotateFromInterfaceOrientation:未调用子控制器,因此我可以对方向的更改进行任何更改
答案 0 :(得分:17)
[parentViewController addChildViewController:childViewController];
请注意,您仍然可以使用属性打开/关闭该行为:
self.automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
默认情况下设置为YES,因此在您的情况下,您无需触摸它。 在iOS 6.0之后弃用 干杯
答案 1 :(得分:5)
您是否有超过1个UIViewController同时在屏幕上主动显示其视图? iOS实际上只需要一次在屏幕上有一个属于UIViewController的视图。如果有多于1个,那么只有视图全屏的UIViewController才会获得调用它的方向更改方法。
答案 2 :(得分:2)
我只想发布对此问题的跟进。在iOS 8之后,不推荐使用rotate方法,而是覆盖子视图控制器中的viewWillTransitionToSize()。
注意:此方法似乎需要您添加子视图控制器,如上所述。我使用故事板和NavigationController构建我的测试,并在按下按钮时按下新的视图控制器。
我在这个函数上设置断点,当我使用调试器检查:self-> parentViewController-> childViewControllers时,childViewControllers为零。
答案 3 :(得分:1)
我遇到了同样的问题。基本上是
didRotateFromInterfaceOrientation:
为根/父视图控制器调用如果您希望为视图控制器调用此方法,则它必须是当前根视图控制器的子视图控制器。
[self addChildViewController:YourUIViewController];
答案 4 :(得分:1)
Per Apple document"当可见视图控制器发生旋转时,willRotateToInterfaceOrientation:duration:,willAnimateRotationToInterfaceOrientation:duration:和didRotateFromInterfaceOrientation:旋转期间调用方法。视图调整大小并由其父视图定位后,也会调用viewWillLayoutSubviews方法。如果在发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图变为可见时,将调用viewWillLayoutSubviews方法。您对此方法的实现可以调用statusBarOrientation方法来确定设备方向。"
但实际上,即使视图是可见的,由于某种原因(可能因为视图没有占据整个屏幕?),相应的视图控制器的旋转相关委托方法也不会被调用。 在某些情况下,覆盖-viewWillLayoutSubviews可能是一种解决方法。
答案 5 :(得分:0)
这是控制器的生命问题。我怀疑你实例化了控制器并添加了子视图然后释放了实例。现在,如果您正在旋转设备,则不会调用添加的子视图旋转委托方法。
第二个原因是每当您添加子视图时,只会调用父视图委托,因为调用者只有父视图控制器的实例。呼叫者可以是导航控制器(基于导航的应用程序),tabbarcontroller(在基于标签的应用程序的情况下)。如果要在旋转中调用子视图方法,则需要明确调用它,如下所示:
if(subviewController != nil){
if([subviewController respondToSelector(rotateMethodOfSubView:)])
[subViewController performSelector(rotateMethodOfSubView:) withObject: self];
}
这应该有助于解决问题。