子视图控制器没有接收到shouldAutorotate方法调用

时间:2014-04-07 20:34:32

标签: ios iphone objective-c uiviewcontroller

我有一个UINavigationController,其上有一个UIViewController(VC1)。 VC1包含一个collectionView。当用户点击一个单元格时,子视图控制器(VC2)被添加到VC1。

VC2应该支持所有方向。而VC1仅支持纵向。在纵向模式下,我希望能够呈现VC2,旋转到横向,让VC2相应调整其布局,关闭VC2,仍然在纵向/布局中显示VC1。

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

(1)

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

    [self presentViewController:vc animated:YES completion:nil];
}

在将presentViewController:animated:completion:与自定义转换或使用传统的viewController包含方法一起使用时,不会调用shouldAutorotate方法。换句话说,这些都不起作用:

(2)

- (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];
}

(3)

- (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];
}

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

非常感谢任何帮助。

对于背景:我精通iOS6 / 7轮换API,UIViewController包含和自定义viewController转换。

修改

我确实实施shouldAutomaticallyForwardRotationMethods无济于事。

2 个答案:

答案 0 :(得分:1)

所以,这可能不是你需要的,但是如果动画转换没有删除呈现视图控制器的视图,则呈现视图控制器似乎保持对shouldAutorotate调用的控制。如果您确实删除了呈现视图控制器的视图,那么shouldAutorotate调用的控制将移动到呈现的视图控制器。

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

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

虽然不是最理想的。

答案 1 :(得分:-1)

您是否碰巧在父控制器上实现- (BOOL)shouldAutomaticallyForwardRotationMethods并让它返回NO?

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