Ios 子viewController未接收到shouldAutorotate方法调用

Ios 子viewController未接收到shouldAutorotate方法调用,ios,iphone,objective-c,uiviewcontroller,Ios,Iphone,Objective C,Uiviewcontroller,我有一个UINavigationController,上面有一个UIViewController(VC1)。VC1包含一个collectionView。当用户点击单元格时,子viewController(VC2)将添加到VC1 VC2应支持所有方向。而VC1只支持纵向。在纵向模式下,我希望能够呈现VC2,旋转成横向,让VC2相应地调整布局,关闭VC2,显示仍处于纵向/布局的VC1 当使用stock方法呈现VC2时,将调用VC2中的shouldAutorotate方法。但是,这是不够的,因为它不允

我有一个UINavigationController,上面有一个UIViewController(VC1)。VC1包含一个collectionView。当用户点击单元格时,子viewController(VC2)将添加到VC1

VC2应支持所有方向。而VC1只支持纵向。在纵向模式下,我希望能够呈现VC2,旋转成横向,让VC2相应地调整布局,关闭VC2,显示仍处于纵向/布局的VC1

当使用stock方法呈现VC2时,将调用VC2中的shouldAutorotate方法。但是,这是不够的,因为它不允许自定义转换:

(一)

当使用带有自定义转换的
presentViewController:animated:completion:
或使用传统的viewController包含方法时,不会调用shouldAutorotate方法。换句话说,这两种方法都不起作用:

(二)

(三)

总之,使用方法#1正确调用旋转方法。但使用#2和#3则不然。这禁止我构建所需的自定义转换,因为这样做意味着子viewController不支持所有方向

任何帮助都将不胜感激

背景:我精通iOS6/7旋转API、UIViewController包容和自定义viewController转换

编辑:


我确实实现了
应该自动向前旋转的方法,但没有效果

您是否碰巧在父控制器上实现了
-(BOOL)shouldAutomaticallyForwardRotationMethods
,并使其返回否


您的情况可能更复杂,因为您支持不同的父视图和子视图控制器进行不同的旋转,但这很容易出错。

因此,这可能不是您需要的,但是,如果动画过渡未删除呈现视图控制器的视图,则呈现视图控制器似乎保持对shouldAutorotate调用的控制。如果确实删除了显示视图控制器的视图,则shouldAutorotate调用的控件将上移到显示视图控制器

我不知道如何在不删除视图的情况下自动发送控件(以便显示透明视图),但您可以手动转发shouldAutorotate调用:

- (BOOL) shouldAutorotate{
    if(self.presentedViewController){
        return [self.presentedViewController shouldAutorotate];
    }
    return YES;
}

但这不是最理想的。

不幸的是,或者幸运的是,我确实实现了这一点。此后,我采取了不同的方法解决了这个问题,但我将其标记为正确,因为我相信您的评估是正确的,手动转发呼叫可能是唯一可以作为(尽管有黑客行为)解决方法的方法。谢谢@阿尔菲汉森:你能详细说明一下你采取的方法吗?实际上,我遇到了完全相同的问题,但在编写库框架时,我的代码无法强制集成代码转发shouldAutorotate调用。不知道你是否找到了不同的解决方法。如果我没记错的话,我最终完全绕过了viewController的限制,而是使用了一个带有rootViewController(带有自己的ChildViewController)的UIWindow。使用UIWindow作为我试图构建的视图层次结构的基础提供了一个更干净、负担更少的石板。“有道理吗?”阿尔菲汉森听起来是对的。实际上,我也遇到过这种方法,但效果不太好,因为我在根上还有两层UIViewController。但是现在我想起来了,我想我可以只做几层UIWindows。比我想要的要多,但我也有同样的问题,但是实现这个解决方案并没有帮助。演示VC的
应该自动旋转
不会在旋转时被调用。呈现的确实会被调用,返回否,但仍会旋转。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    CommentsViewController *vc = [[CommentsViewController alloc] initWithNibName:@"CommentsViewController" bundle:nil];
    self.transitioningDelegate = [[TransitioningDelegate alloc] init];
    vc.modalPresentationStyle = UIModalPresentationCustom;
    vc.transitioningDelegate = self.transitioningDelegate;

    [self presentViewController:vc animated:YES completion:nil];
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    CommentsViewController *vc = [[CommentsViewController alloc] initWithNibName:@"CommentsViewController" bundle:nil];

    [self addChildViewController:vc];
    vc.view.frame = self.view.bounds;
    [self.view addSubview:vc.view]; // Assume I'm doing a cool custom animation here
    [vc didMoveToParentViewController:self];
}
- (BOOL) shouldAutorotate{
    if(self.presentedViewController){
        return [self.presentedViewController shouldAutorotate];
    }
    return YES;
}