1

アプリにカスタムコンテナビューコントローラーがありますが、iOS5で行ったのと同じ回転動作をiOS6で実現できませんでした。

コンテナ(containerVCと呼びます)には、2つのView Controllerがあります。1つは縦向きのままにする必要があり(portraitVC)、もう1つは横向きに回転できます(rotatingVC)。セグメント化されたコントロールを使用してそれらを切り替えます。

最初にportraitVCが表示された状態でcontainerVCを開いてから、電話機を横向きに回転させると、portraitVCが正しく回転しません。しかし、rotatingVCに切り替え、横向きに回転してから、電話機を横向きにしたままportraitVCに切り替えると、portraitVCの描画が誤って横向きに描画されます。

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

そしてこれはrotatingVCで:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

回転VCを選択した後にportraitVCを選択すると、containerVCまたはportraitVCで回転メソッドまたはコールバックが呼び出されません。外観メソッドが呼び出され、テーブルビューを保持するportraitVCは、テーブルビューコールバックでランドスケープジオメトリを持つUITableViewCellsを取得します。

PortraitVCをランドスケープにサポートする必要があるのは世界の終わりではありませんが、アプリの他の部分との一貫性を保つために、可能であれば優先しません。組み込みのコンテナVCは、サブクラス化してsupportedInterfaceOrientationsをオーバーライドすると正しく機能するため、これを機能させる方法があるはずです。

4

2 に答える 2

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

私がiOS6の前に使用しなかったコントローラーには、viewWillLayoutSubviews、willRotateToInterfaceOrientation、didRotateFromInterfaceOrientationの3つのメソッドがあります。たとえば、willRotateToInterfaceOrientationでは現在の向きを保存し、viewWillLayoutSubviewsではすべてのサブビューを再配置します。

子ViewControllerを作成する場合。デバイスの向きに関する親のViewController設定を使用します-そう思います。

状況をよりよく理解し、より良い解決策を見つけられることをうれしく思います。

于 2012-09-25T16:07:49.047 に答える
0

同じ問題があることに気づき、言い方を変えました。iOS 6:一部のビューを縦向きに制限し、他のビューを回転できるようにするにはどうすればよいですか?

助けになるかもしれない自分の質問に部分的に答えただけです。コンテナビューで子供たちにサポートされている向きを尋ねるというあなたのアイデアが好きです。shouldAutorotateToInterfaceOrientation:たぶん、iOS<6ですでに配置されている子供たちを呼び出すことはさらに良い考えです。

于 2012-09-29T11:21:30.660 に答える