尝试使用firstInterfaceOrientationForPresentation来触发viewController更改

时间:2012-12-18 14:12:15

标签: iphone objective-c ios cocoa-touch uiinterfaceorientation

我正在使用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:并且我有轮换工作,因此某些视图可以有不同的方向。问题是,每个具有不同方向的视图都需要用户倾斜手机以更改其锁定在正确方向上的方向。 我已经完成了大量的阅读以使其正常工作,似乎我需要在每个视图加载之前触发preferredInterfaceOrientationForPresentation,但它不会触发。 我认为它没有触发,因为MSNavigationPaneViewController没有使用presentViewController更改视图控制器。 这是MSNavigationPaneViewController用于更改视图的代码

- (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。如果窗口刚刚切换,则不会。 所以我确实需要一种方法来欺骗它。

2 个答案:

答案 0 :(得分:9)

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

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

您需要确保在执行此代码时,根视图控制器的-supportedInterfaceOrientations返回正确的掩码(对应于您希望强制方向的方式)。

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

答案 1 :(得分:6)

{p> preferredInterfaceOrientationForPresentation不会在UINavigationController内的控制器上调用。

您必须继承UINavigationController,然后自己实现此功能。您只想委托给topViewController

参考结帐:http://code.shabz.co/post/32051014482/ios-6-supportedorientations-with-uinavigationcontroller

我还发现了UINavigationController子类的实现:https://gist.github.com/3842178