【问题标题】:Child UIViewControllers not calling shouldAutorotate - iOS 7子 UIViewControllers 不调用 shouldAutorotate - iOS 7
【发布时间】:2026-01-31 12:35:01
【问题描述】:

所以我搜索了几页并在这里找到了一些关于堆栈溢出的答案,但似乎没有任何效果。

我有一个根视图控制器。它有 2 个子视图控制器。 (基本内容视图和菜单覆盖)。

目标是让内容视图响应方向变化,但覆盖菜单仅以纵向显示(设计选择在上下文中更有意义)

在我的根 VC 中,我以这种方式添加了我的子视图:

self.contentVC = [DELEGATE.storyboard instantiateViewControllerWithIdentifier:@"content"];
[self addChildViewController:self.contentVC];
self.contentVC.view.frame = self.view.bounds;
[self.view addSubview:self.contentVC.view];
[self.contentVC didMoveToParentViewController:self];

并且根 VC 声明了以下方法:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

-(BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return YES;
}

-(BOOL) shouldAutomaticallyForwardRotationMethods{
    return YES;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

在我的 conentVC 中:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

在menuVC中:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
    return NO;
}

我通过让 rootVC 调用 contentVC 上的一个方法来定位和旋转元素,以编程方式解决了这个问题,现在这工作正常。我主要担心的是,如果苹果增加更多的屏幕尺寸,自动旋转的适应性会更强。我缺少自动旋转解决方案吗?

如上所述,我已经查看了一些帖子,并且知道已经讨论过类似的事情,但我发现的任何解决方案似乎都不起作用。

【问题讨论】:

    标签: ios iphone objective-c ios7 autorotate


    【解决方案1】:

    你误解了shouldAutomaticallyForwardRotationMethods 的作用。它只转发这些方法(请参阅文档):

     willRotateToInterfaceOrientation:duration:
     willAnimateRotationToInterfaceOrientation:duration:
     didRotateFromInterfaceOrientation:
    

    框架不需要在子节点上调用supportedInterfaceOrientations:shouldAutorotate,因为现在只咨询最顶层的视图控制器。 (例如,一个 UINavigationController 不再咨询它新推的孩子。)如果你的父母想咨询它的孩子,很好;它应该继续咨询他们。但这是你的电话,与shouldAutomaticallyForwardRotationMethods无关。

    【讨论】:

    • 感谢您的快速回复。关于 shouldAutomaticallyForwardRotationMethods 的澄清清除了一些问题。 Def wasnt 有没有办法解耦两个子 VC 的旋转行为,一个响应 autoRotate 而另一个不响应?我试图让两个子 VC 都与父级绑定的唯一原因是一个预先存在的菜单结构,它的改变会产生连锁反应,我真的试图在这里最小化。
    • 我不明白你的第二个问题(“解耦”)。不以任何方式咨询孩子。仅咨询最顶层的视图控制器(最终的父级或呈现的视图控制器)。会发生什么取决于它给出的答案。在这一点上我只是在重复自己。
    • 我的问题:在这种情况下,有没有办法让我设置的 2 个子视图控制器中只有 1 个响应自动旋转。这是我的目标,我最初的问题是有没有办法设置它。我说我目前已经实现了一种“有效”的方法来复制这个接口——根 VC 在它想要旋转的子 VC 上调用一个方法,并且该方法处理该屏幕上的旋转。如果可以的话,我更喜欢使用自动旋转。
    • 两个子视图控制器都不会“响应自动旋转”,因为框架不会或永远不会咨询它们。 做什么取决于。现在我已经重复了第三次。
    • 看 - 我觉得你出于某种原因被你(出于某种原因)试图帮助的陌生人激怒了。我知道框架没有咨询任何子 VC 类。感谢您抽出宝贵时间,但我不要求您重复之前的任何部分答案。我了解该框架并未咨询儿童 VC。
    【解决方案2】:

    您可以查看 TARGETS-General-Deployment Info 中的菜单 Device Orientation

    【讨论】:

    • 系统将视图控制器支持的方向与应用支持的方向(由 Info.plist 文件或应用代理的 application:supportedInterfaceOrientationsForWindow: 方法确定)相交以确定是否旋转。 bysupportedInterfaceOrientations