“didRotateFromInterfaceOrientation:”未调用

时间:2011-10-11 11:08:07

标签: objective-c ipad uiinterfaceorientation addsubview

嗨我正在尝试在主视图的小视图中添加子视图控制器的视图 但是didRotateFromInterfaceOrientation:未调用子控制器,因此我可以对方向的更改进行任何更改

6 个答案:

答案 0 :(得分:17)

只有当你将childViewController添加到parentViewController时才会调用didRotateFromInterfaceOrientation(在childViewController中):

[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];

} 

这应该有助于解决问题。