shouldAutorotate呼叫iPhone而不是iPad

时间:2015-10-04 00:55:36

标签: ios shouldautorotate

我有一个适用于iOS 8/9的通用应用程序,其中包含一个MainStoryboard_iPhone和一个MainStoryboard_iPad。故事板中的入口点是带有Tab Bar的RootViewController。 RootViewController控制器非常简单

- (void)viewDidLoad
{
[(VIBAppDelegate *)[[UIApplication sharedApplication] delegate] setRootViewController:self];
self.interfaceOrientationMask = UIInterfaceOrientationMaskAll;
self.preferredOrientation = UIInterfaceOrientationMaskAll;
[super viewDidLoad];}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return self.interfaceOrientationMask;
}

- (BOOL)shouldAutorotate{
return YES;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    UIViewController *currentVC = self.selectedViewController;
    if ([currentVC respondsToSelector:@selector(preferredInterfaceOrientationForPresentation)]) {
        UIInterfaceOrientation orientation = [currentVC preferredInterfaceOrientationForPresentation];
        return orientation;
    }else{
    return self.preferredOrientation;
    }
}

当我在iPhone上启动此应用程序时,在应用程序启动期间以及设备旋转时,都会调用supportedInterfaceOrientation和shouldAutorotate方法。当我在iPad上启动应用程序时,它们从未被调用过。在这两种情况下,都会按预期调用viewDidLoad函数。

我一直困惑于此。我认为除了布局之外,故事板没有区别。两种设备类型都允许Info.plist文件中的所有4个方向和其他相关键。

<key>UIMainStoryboardFile</key>
<string>MainStoryboard_iPhone</string>
<key>UIMainStoryboardFile~ipad</key>
<string>MainStoryboard_iPad</string>
<key>UIStatusBarHidden</key>
<true/>
<key>UIStatusBarHidden~ipad</key>
<true/>
<key>UIStatusBarStyle</key>
<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

在shouldAutorotate函数上放置断点显示UIWindow正在调用_shouldAutorotateToInterfaceOrientation:checkForDismissal:is ...由UIApplicationMain调用。这是预期的。

1 个答案:

答案 0 :(得分:4)

在iOS 9上,iPad应用程序默认选择 iPad多任务处理。这意味着它必须始终采用所有方向。由于您尚未选择 out 的iPad多任务处理,因此运行时假设您 始终采用所有方向 - 因此它不需要费心去问你什么你允许的方向,因为它已经知道答案(所有这些)。