shouldAutorotate 在 iPhone 上调用但不在 iPad 上调用
shouldAutorotate called on iPhone but not on iPad
我有一个 iOS 8/9 的通用应用程序,其中包含一个 MainStoryboard_iPhone 和一个 MainStoryboard_iPad。故事板中的入口点是带有选项卡栏的 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 调用。这符合预期。
在 iOS 9 上,iPad 应用默认选择 iPad 多任务处理。这意味着它 必须 始终采用所有方向。由于您没有选择 out of iPad 多任务处理,运行时假定您始终 do 采用所有方向 - 因此它无需费心询问您允许的方向,因为它已经知道答案(所有方向)。
我有一个 iOS 8/9 的通用应用程序,其中包含一个 MainStoryboard_iPhone 和一个 MainStoryboard_iPad。故事板中的入口点是带有选项卡栏的 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 调用。这符合预期。
在 iOS 9 上,iPad 应用默认选择 iPad 多任务处理。这意味着它 必须 始终采用所有方向。由于您没有选择 out of iPad 多任务处理,运行时假定您始终 do 采用所有方向 - 因此它无需费心询问您允许的方向,因为它已经知道答案(所有方向)。