使用自定义容器视图控制器在iOS 6中旋转

时间:2012-09-25 15:37:59

标签: ios ios6

我的应用程序中有一个自定义容器视图控制器,并且无法在iOS 6中实现与iOS 5中相同的旋转行为。

容器(称为containerVC)包含两个视图控制器,一个应保持纵向(portraitVC),另一个可以旋转为横向(rotateVC)。我使用分段控件在它们之间切换。

如果我打开最初显示portraitVC的containerVC,然后将手机旋转到横向,则portraitVC正确无法旋转。但是,如果我切换到旋转VC,旋转到横向,然后切换到portraitVC,而手机仍然保持横向,肖像VC绘制不正确绘制自己的横向。

在iOS 5中,portraitVC始终保持纵向。

我在containerVC中有这个代码用于切换视图控制器:

- (IBAction)segmentChanged:(id)sender {
    UIViewController *toViewController = [self viewControllerForSegmentIndex:self.selectedSegmentIndex];
    [self addChildViewController:toViewController];

    UIViewController *fromViewController = self.selectedViewController;

    [self transitionFromViewController:self.selectedViewController
                      toViewController:toViewController
                              duration:0
                               options:0
                            animations:^{}
                            completion:^(BOOL finished) {
                                self.selectedViewController = toViewController;
                                [toViewController didMoveToParentViewController:self];
                                [fromViewController removeFromParentViewController];
                            }];
}

这在containerVC中处理旋转:

- (NSUInteger)supportedInterfaceOrientations {
    UIInterfaceOrientationMask mask = UIInterfaceOrientationMaskPortrait;
    if ([self.selectedViewController respondsToSelector:@selector(supportedInterfaceOrientations)] ) {
        mask = [self.selectedViewController supportedInterfaceOrientations];
    }
    return mask;
}

这在肖像VC:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

这在旋转VC中:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

当我在选择rotateVC后选择portraitVC时,在containerVC或portraitVC上都没有调用任何旋转方法或回调。调用外观方法,并且拥有tableview的portraitVC在tableview回调中获得具有横向几何的UITableViewCells。

如果我们必须制作portraitVC支持格局,那么这不是世界末日,但如果可能的话,首选不是为了与应用程序的其他部分保持一致。似乎应该有一种方法可以使它工作,因为内置容器VC在您对它们进行子类化并覆盖supportedInterfaceOrientations时正常工作。

2 个答案:

答案 0 :(得分:0)

我今天遇到了一个非常类似的问题并用替换根控制器来解决它 - 我创建了新的视图控制器并将其分配给应用程序窗口的根视图控制器。这个新控制器仅支持Landscape。原始根控制器支持这两种模式。 所以不是[self addChild ...而是旋转设备并替换根视图控制器。

UIInterfaceOrientation current = [[UIDevice currentDevice] orientation];
if ( UIInterfaceOrientationIsPortrait(current)) {
    [UIView beginAnimations:@"InterfaceOrientation" context:nil];
    [UIView setAnimationDuration:[application statusBarOrientationAnimationDuration]];
    [[[application delegate] window] setRootViewController:controller];
    [UIView commitAnimations];
    [application setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
}
else {
    [[[application delegate] window] setRootViewController:controller];
}

控制器中有三种方法在iOS 6之前没有使用过,你在问题中没有提到: viewWillLayoutSubviews,willRotateToInterfaceOrientation和didRotateFromInterfaceOrientation。例如,在willRotateToInterfaceOrientation中我保存当前方向,在viewWillLayoutSubviews中我重新排列所有子视图。

如果您创建子视图控制器。它使用父视图控制器设置有关设备方向 - 我想是这样。

我很乐意更好地了解情况并找到更好的解决方案。

答案 1 :(得分:0)

我注意到我遇到了同样的问题,并且措辞不同:iOS 6: How do I restrict some views to portrait and allow others to rotate?

我只是对那个可能有帮助的问题给出了部分答案。我喜欢你的想法,让容器视图向其子项询问支持的方向;或许更好的想法是对已经适用于iOS的儿童打电话shouldAutorotateToInterfaceOrientation:< 6。