7

私はMSNavigationPaneViewController ここから使用していて、回転のようなものが機能しています。ルートの回転メソッドをオーバーライドしましたUINavigationController

-(BOOL)shouldAutorotate
{
    return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if (appDelegate.topViewController != nil) {
        return [appDelegate.topViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if (appDelegate.topViewController != nil) {
        return [appDelegate.topViewController preferredInterfaceOrientationForPresentation];
    } else {
        return UIInterfaceOrientationPortrait;
    }
}

MSNavigationPaneViewControllerこれを使用してプッシュするとpresentViewController: animated:completion:、回転が機能するため、特定のビューの向きが異なる場合があります。問題は、向きが異なる各ビューでは、ユーザーが電話を傾けて向きを変更する必要があり、その時点で正しい向きにロックされます。これを機能させるためにたくさんの読書をしました。各ビューが読み込まれる前に起動する必要があるようですがpreferredInterfaceOrientationForPresentation、起動していません。MSNavigationPaneViewControllerを使用してViewControllerを変更していないため、起動していないと思いますpresentViewControllerMSNavigationPaneViewControllerこれは、ビューを変更するために使用されるコードです

- (void)setPaneViewController:(UIViewController *)paneViewController
{
    if (_paneViewController == nil) {

        paneViewController.view.frame = _paneView.bounds;
        _paneViewController = paneViewController;
        [self addChildViewController:_paneViewController];
        [_paneView addSubview:_paneViewController.view];
        [_paneViewController didMoveToParentViewController:self];

    } else if (_paneViewController != paneViewController) {

        paneViewController.view.frame = _paneView.bounds;
        [_paneViewController willMoveToParentViewController:nil];
        [self addChildViewController:paneViewController];

        void(^transitionCompletion)(BOOL finished) = ^(BOOL finished) {
            [_paneViewController removeFromParentViewController];
            [paneViewController didMoveToParentViewController:self];
            _paneViewController = paneViewController;
        };

        [self transitionFromViewController:_paneViewController
                          toViewController:paneViewController
                                  duration:0
                                   options:UIViewAnimationOptionTransitionNone
                                animations:nil
                                completion:transitionCompletion];
    }
}

これは、viewControllerを切り替えているだけなので、呼び出していないように見えますpreferredInterfaceOrientationForPresentation

強制的preferredInterfaceOrientationForPresentationに呼び出される方法や、隠されたビューによって呼び出されるように騙す方法はありますか?

ありがとう

編集 - -

私は、新しいローテーションシステムがiOS6でどのように機能するか、そしてそれを管理するのは根本的なことであることを完全に理解しています。ただしpreferredInterfaceOrientationForPresentation、次のビューがpresented正しいメソッドの1つを使用している場合にのみ呼び出されるようです。ウィンドウが切り替えられたばかりの場合は違います。だから私は実際にこれをだまして呼び出される方法が必要です。

4

2 に答える 2

9

rootViewController をリセットすることで、サポートされているインターフェイスの向きを再評価するようにウィンドウをだますことができます。

UIApplication *app = [UIApplication sharedApplication];
UIWindow *window = [[app windows] objectAtIndex:0];
UIViewController *root = window.rootViewController;
window.rootViewController = nil;
window.rootViewController = root;

このコードが実行されるときに、ルート ビュー コントローラーの -supportedInterfaceOrientations が適切なマスクを返すことを確認する必要があります (方向を強制する方法に対応します)。

このハックにより、画面がすばやく点滅し、進行中のアニメーションに不具合が生じる可能性があることに注意してください。

于 2012-12-21T21:21:10.627 に答える
6

preferredInterfaceOrientationForPresentation内のコントローラーでは呼び出されませんUINavigationController

サブクラス化してからUINavigationController、この機能を自分で実装する必要があります。に委任したいだけですtopViewController

参照用にチェックアウト: http://code.shabz.co/post/32051014482/ios-6-supportedorientations-with-uinavigationcontroller

UINavigationControllerサブクラスのこの実装も見つけました: https://gist.github.com/3842178

于 2012-12-19T01:52:44.287 に答える