我正在使用 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 在 viewController 更改时触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13934807/