子视图控制器旋转方法不被调用

概要

我正在尝试将子视图控制器添加到父视图控制器,并有父视图控制器通知子视图控制器的旋转事件。 但是,旋转消息不会被转发到子视图控制器(这是默认行为)。 为什么这个默认行为不会发生?

环境:iOS 7,XCode 5,OSX 10.9

细节:

我正在按照Apple文档中的说明实现一个自定义容器视图控制器: “创build自定义容器视图控制器” 。 我试图build立一个简单的父母子女关系,转发轮换事件。 总层次结构如图14-1所示:

ParentViewController --------> RootView | / \ | / \ ˅ / \ ChildViewController ---> ChildView \ \ OverLayView 

我正在使用parentViewController(unityViewController = childViewController,unityView = childView)中的文件清单4-1中的代码完成此操作:

 // In the ParentViewController // Called by the Application Delegate in application:didFinishLaunchingWithOptions: - (void)addUnityViewController:(UIViewController *)unityViewController withUnityView:(UIView *)unityView { [self addChildViewController:unityViewController]; // 1. Establish Child parent relationship unityView.frame = self.view.frame; // 2. Set the frame (explicitly or with constraints) [self.view addSubview:unityView]; // 2.1 Add the subview AFTER you set the frame ... // add some view constraints here [self.view sendSubviewToBack:unityView]; // In the back, but not completely obstructed by any other views [unityViewController didMoveToParentViewController:self];// 3. Tell the child what happened } 

此代码成功地将子视图显示为RootView的子视图,OverlayView添加一些functionbutton。 但是,当设备旋转时,父视图控制器成功地旋转其视图,但不会将旋转消息转发给子视图控制器(unityViewController),从而导致在rootView中显示不正确的childView(unityView)。 根据“创build自定义容器视图控制器”,这应该自动发生:

自定义外观和旋转callback行为:将容器添加到容器后,一旦发生需要转发消息的事件,容器就会自动将旋转和外观callback转发给子视图控制器。

为了确保这种情况发生,我推翻了以下方法:

 // In the parent ViewController: - (BOOL)shouldAutorotate { return YES; } - (BOOL)shouldAutomaticallyForwardAppearanceMethods { return YES; } - (BOOL)shouldAutomaticallyForwardRotationMethods { return YES; } 

但是, ViewController(unityViewController)中的willRotateToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:方法永远不会被调用。 我已经能够确认方法确实被调用,并且在那些我调用super的方法中,但是子方法从不被调用。

题:

这种默认行为没有发生的原因是什么? 我需要父母和孩子接收旋转信息以便正确显示。

:我知道我可以手动调用这些方法在父,但我不想手动进行这些调用,并添加额外的代码,应该是默认的行为。

十分感谢你的帮助!

为了您的子视图控制器接收转发的方向callback,它必须是可见的。 您的子视图控制器很可能是不可见的,因为它的视图尚未添加到视图层次中。

如果你改变你的方法,你应该开始看到你的旋转消息被称为:

 - (void)addUnityViewController:(UIViewController *)unityViewController { [self addChildViewController:unityViewController]; unityViewController.view.frame = self.view.bounds; [self.view addSubview:unityViewController.view]; ... // add some view constraints here [self.view sendSubviewToBack:unityViewController.view]; [unityViewController didMoveToParentViewController:self]; } 

有关更多信息: 响应可见视图控制器中的方向更改 。

您可能必须在子视图上设置AutoresizingMask:

 [childView setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 

这可以确保视图在旋转期间调整其父视图。