View Controller内部的View Controller不会收到旋转消息 - ios

时间:2011-07-19 10:58:01

标签: objective-c ios uiscrollview rotation

我有一个自定义的视图控制器(我们称之为包装器)。其视图仅包含UIScrollView。滚动视图包含另一个自定义视图控制器(我们称之为里面的视图),从xib文件初始化(滚动视图本身也是从xib文件初始化的,但我不是相信这很重要。)

使用UITabBarController显示包装器视图,其中包含几个类似的视图控制器。

我有这个奇怪的问题:包装器的旋转功能 - shouldAutoRotatewillAnimateRotation - 每次旋转设备时都会调用。出于某种原因,内部视图的旋转功能不会被调用,但它仍然会旋转。内部视图shouldAutoRotate在初始化时(应用程序启动时)会被调用。

我看过谷歌,找不到与我的案子有关的任何内容。我不确定它是否相关,但是在所有xib文件上都检查了 Autoresize子视图

如果你能帮我解决这个问题,我会很高兴的。我需要内部视图的旋转函数来调用旋转以便手动排列它,但我想避免从包装视图中调用它们(而不是它应该工作)。

提前谢谢!

3 个答案:

答案 0 :(得分:1)

因为将它们作为子视图添加到你的scrollView中,所以不会调用innerViewController的旋转函数。当你的父控制器中的方向发生变化时,你可以做的是生成NSNotification,然后你可以在子视图中接收通知并相应地管理它们。或者,当您在父控制器中调用shouldAutoRoatate然后手动调用子视图的autorotate方法时,您可以遍历UIScrollView的子视图。希望你明白。

答案 1 :(得分:1)

最简单的方法是在.h文件中保留一些UIInnerViewController* innerController,在.m文件中保存一些- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation来调用内部的 包装器内的wrapper.m - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ BOOL innerResult = [innerController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; //may be more computations here return innerResult;// or any other value, based on your needs } 如下:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(orientationChanged:) 
                                      name:UIDeviceOrientationDidChangeNotification 
                                      object:nil];

您可以使用的其他方法是将内部控制器注册到UIDeviceOrientationDidChangeNotification,如下所示:

-(void)orientationChanged:(NSNotification*)notification;

和同一内部控制器中UIDeviceOrientation的布局子视图。您唯一应该理解的是,UIInterfaceOrientationUIDeviceOrientationFaceUp略有不同,并且在大多数情况下可能保留不适用于UI更改的{{1}}值。< / p>

答案 2 :(得分:0)

在iOS 4中不支持将视图控制器嵌套在自定义视图控制器中。您通常可以手动将所有必要的消息转发到子VC,但结果可以接受。