1

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

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

如果我打开 containerVC 并最初显示 PortraitVC,然后将手机旋转到横向,portraitVC 不会正确旋转。但是,如果我切换到旋转VC,旋转到横向,然后在手机仍处于横向状态时切换到纵向VC,纵向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;
}

这在 PortraitVC 中:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

这在旋转VC中:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

当我在选择rotatingVC 后选择portraitVC 时,在containerVC 或portraitVC 上都不会调用任何旋转方法或回调。外观方法被调用,并且持有 tableview 的 PortraitVC 在 tableview 回调中获取具有横向几何形状的 UITableViewCells。

如果我们必须让 PortraitVC 支持横向,这不是世界末日,但如果可能的话,为了与应用程序的其他部分保持一致,我们更倾向于不这样做。似乎应该有一种方法可以让它工作,因为当您对它们进行子类化并覆盖supportedInterfaceOrientations时,内置的容器VC可以正常工作。

4

2 回答 2

0

我注意到我有同样的问题,只是措辞不同:iOS 6:如何将某些视图限制为纵向并允许其他视图旋转?

我只是对我自己的问题给出了部分答案,这可能会有所帮助。我喜欢您让容器视图向其子级询问支持的方向的想法;shouldAutorotateToInterfaceOrientation:也许调用iOS < 6 已经存在的孩子是一个更好的主意。

于 2012-09-29T11:21:30.660 回答
0

我今天遇到了一个非常相似的问题,并通过替换根控制器解决了它 - 我创建了新的视图控制器并将其分配给应用程序窗口的根视图控制器。这个新控制器仅支持横向。原始根控制器支持这两种模式。所以不是 [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 我重新排列所有子视图。

如果您创建一个子视图控制器。它使用关于设备方向的父视图控制器设置——我想是的。

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

于 2012-09-25T16:07:49.047 回答