我正在使用 MSNavigationPaneViewController from here 并且有旋转工作。
我已经覆盖了我的根 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: 并且我有旋转工作,所以某些 View 可以有不同的方向。问题是,每个具有不同方向的 View 都需要用户倾斜手机以更改方向,此时它会锁定正确的方向。
我已经进行了大量阅读以使其正常工作,似乎我需要 preferredInterfaceOrientationForPresentation 在加载每个 View 之前触发,但它没有触发。
我认为它没有触发,因为 MSNavigationPaneViewController 没有使用 presentViewController 更改 View Controller 。
这是MSNavigationPaneViewController用来改变 View 的代码
- (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,或者诱使它被隐藏 View 调用?

谢谢

编辑 - -

我完全理解新的轮换系统在 iOS6 中是如何工作的,并且它是由根来管理的。然而 preferredInterfaceOrientationForPresentation 似乎只有在下一个 View 是使用正确方法之一的 presented 时才会被调用。如果窗口刚刚切换,则不会。
所以我确实需要一种方法来欺骗它被调用。

最佳答案

您可以通过重置其 rootViewController 来欺骗窗口重新评估其支持的界面方向。

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

您需要确保在执行此代码时,根 View Controller 的-supportedInterfaceOrientations返回正确的掩码(与您要强制的方向相对应)。

请注意,此 hack 可能会导致屏幕快速闪烁并导致任何正在进行的动画出现故障。

关于iphone - 技巧 preferredInterfaceOrientationForPresentation 在 vi​​ewController 更改时触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13934807/

10-16 14:08
查看更多