绝招preferredInterfaceOrientationForPresentation火上的v

2019-07-05 16:46发布

我使用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没有改变使用视图控制器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与正确的方法之一。 若只是切换窗口。 所以,我的确需要一种方法来欺骗这个被调用。

Answer 1:

您可以通过重置其RootViewController的欺骗窗户进入重新计价其支持的接口方向。

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

你需要确保该代码执行时,根视图控制器的-supportedInterfaceOrientations返回正确的面罩(对应于你想如何强制方向)。

请注意,这个技巧可能会导致在屏幕上快速闪过和干扰任何正在进行的动画。



Answer 2:

preferredInterfaceOrientationForPresentation不会在控制器内调用UINavigationController

你将不得不继承UINavigationController ,然后自己实现这个功能。 你只是想委托给topViewController

仅供参考看看: http://code.shabz.co/post/32051014482/ios-6-supportedorientations-with-uinavigationcontroller

我也发现了这个实施的UINavigationController子类: https://gist.github.com/3842178



文章来源: Trick preferredInterfaceOrientationForPresentation to fire on viewController change