【问题标题】:View Controller inside View Controller won't receive rotation messages - ios视图控制器内部的视图控制器不会收到旋转消息 - ios
【发布时间】:2011-07-19 10:58:00
【问题描述】:

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

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

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

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

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

提前谢谢你!

【问题讨论】:

    标签: objective-c ios uiscrollview rotation


    【解决方案1】:

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

    【讨论】:

    • 我明白,但我想知道 - 为什么外部 viewController 不会将函数发送到它的子视图?似乎很奇怪。无论如何,我会手动调用它,只是想知道为什么它会这样工作。谢谢。
    【解决方案2】:

    最简单的方法是在你的.h文件和.m中保存一些UIInnerViewController* innerController来调用inner的 - (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
    }
    

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

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

    -(void)orientationChanged:(NSNotification*)notification;中布局子视图在同一个内部控制器中。您唯一应该注意的是,UIDeviceOrientationUIInterfaceOrientation 略有不同,并且可能具有 UIDeviceOrientationFaceUp 这样的值,在大多数情况下不适用于 UI 更改。

    【讨论】:

      【解决方案3】:

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

      【讨论】: