以横向方式从iPhone 6 Plus主屏幕以纵向模式启动会导致错误的方向

这个问题的实际标题比我可能适合的长:

启动一个应用程序,其根视图控制器仅支持纵向,但在iPhone 6 Plus上支持横向方向,而主屏幕处于横向方向时,将导致应用程序的窗口处于横向方向,但该设备是在纵向方向。

总之,它看起来像这样:

当它应该是这样的:

重现步骤:

  1. 运行iOS 8.0的iPhone 6 Plus。

  2. 一个应用程序,其plist支持所有,但肖像颠倒的方向。

  3. 该应用程序的根视图控制器是一个UITabBarController。

  4. 一切,标签栏控制器及其所有后代子视图控制器从supportedInterfaceOrientations返回UIInterfaceOrientationMaskPortrait

  5. 从iOS主屏幕开始。

  6. 旋转到横向(需要iPhone 6 Plus)。

  7. 冷启动应用程序。

  8. 结果:界面取向破裂。

我想不出任何其他的方式来执行一个肖像方向, 除了完全禁用风景,我不能这样做:我们的网页浏览器模式视图控制器需要风景。

我甚至尝试了inheritanceUITabBarController并覆盖supportedInterfaceOrientations来返回肖像专用掩码,但是这个(即使是上面所有的其他步骤)也没有解决这个问题。


这是一个示例项目的链接,显示错误。


当我在iPhone 6 Plus的横向上启动我们的应用程序时遇到同样的问题。

我们的解决scheme是通过项目设置从plist中删除横向支持的界面方向:

删除横向

并实现应用程序:supportedInterfaceOrientationsForWindow:在应用程序委托中:

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskAllButUpsideDown; } 

显然你的plist中的信息是指定你的应用程序允许启动的方向。

设置UIApplicationstatusBarOrientation似乎适用于我。 我将它放在application:didFinishLaunchingWithOptions:程序委托中的application:didFinishLaunchingWithOptions:方法中。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { application.statusBarOrientation = UIInterfaceOrientationPortrait; // the rest of the method } 

使用UITabBarController作为根视图控制器时,这似乎是iOS 8中的一个错误。 一个解决方法是使用大多数香草UIViewController作为根视图控制器。 这个香草视图控制器将作为你的标签栏控制器的父视图控制器:

 ///------------------------ /// Portrait-Only Container ///------------------------ @interface PortraitOnlyContainerViewController : UIViewController @end @implementation PortraitOnlyContainerViewController - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } @end // Elsewhere, in app did finish launching ... PortraitOnlyContainerViewController *container = nil; container = [[PortraitOnlyContainerViewController alloc] initWithNibName:nil bundle:nil]; [container addChildViewController:self.tabBarController]; self.tabBarController.view.frame = container.view.bounds; [container.view addSubview:self.tabBarController.view]; [self.tabBarController didMoveToParentViewController:container]; [self.window setRootViewController:container]; 

我有一个非常类似的问题。 除了播放video之外,我都想强制使用人像模式。

我做的是:

1)强制AppDelegate中的应用程序方向为纵向:

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if ([window.rootViewController.presentedViewController isKindOfClass:[MPMoviePlayerViewController class]]) { return UIInterfaceOrientationMaskAll; } return UIInterfaceOrientationMaskPortrait; } 

2)启动一个空的模态视图控制器在我的情况下解决了这个问题。 我在我的NavigationViewController的根目录下的第一个视图控制器(在应用程序启动后可见的第一个视图控制器)的viewDidLoad中启动它:

 - (void)showAndHideNamelessViewControllerToFixOrientation { UIViewController* viewController = [[UIViewController alloc] init]; [self presentViewController:viewController animated:NO completion:nil]; [viewController dismissViewControllerAnimated:NO completion:nil]; } 

请尝试下面的代码。 可能这个问题是由关键窗口的尺寸引起的。

 // in application:didFinishLaunchingWithOptions: ... self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [self.window setFrame:[[UIScreen mainScreen] bounds]]; //<- ADD!! 

Jared使用通用的容器视图控制器来解决这个问题。 我已经使用supportedInterfaceOrientations将选项卡栏控制器也分类了,没有运气。 无论启动后6+的方向如何,标签栏的窗口都会报告frame = (0 0; 736 414)

到目前为止,我find的唯一解决方法是在makeKeyAndVisible之后强制窗口框架

[self.window makeKeyAndVisible]; self.window.frame = CGRectMake(0, 0, MIN(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)), MAX(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)));

我只希望我的应用程序以横向模式打开(而不会出现上述iPhone 6 Plus中所描述的问题),所以我将Landscape (left home button)Landscape (right home button)为我的应用程序中允许的唯一方向PLIST文件。 这可以解决我的应用程序打开时的方向问题。 但是,我需要我的应用程序支持一个视图的肖像模式,因为我在我的应用程序中显示一个UIImagePickerController ,苹果需要在iPhone上以纵向模式显示。

我只能通过在AppDelegate包含以下代码来支持这一个视图的肖像,同时保持我的应用以横向模式打开。

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { return UIInterfaceOrientationMaskAllButUpsideDown; } else { return UIInterfaceOrientationMaskAll; } } 

对于我自己,我遇到了与jaredsinclair相同的问题,但使用supportedInterfaceOrientations方法对UIViewController进行子类化并不能解决问题。 相反,我做了他在我的AppDelegate appDidFinishLaunching方法中所做的,并将我的UITabBarController作为一个孩子添加到普通的UIViewController而不是他的子类,它的工作!

我处于相同的情况,做[self.window setFrame:…]不适合我。

在应用程序结尾处添加以下内容:didFinishLaunchingWithOptions是我发现的唯一工作。 它使屏幕闪烁,不完全清洁和高效。

我在应用程序的最后添加了这个:didFinishLaunchingWithOptions:

 UIViewController *portraitViewController = [[UIViewController alloc] init]; UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController]; [self.navController presentViewController:nc animated:NO completion:nil]; [self.navController dismissViewControllerAnimated:NO completion:nil]; [UIViewController attemptRotationToDeviceOrientation]; 

我有一个类似的问题是我的应用程序运行在横向和纵向与UITabBarController作为根视图控制器。

无论何时在横向模式下启动应用程序,视图都是不正确的。

所有我必须做的: – 删除XIB中的rootview控制器分配。 – 一旦启动应用程序,手动添加它:


  • (void)applicationDidFinishLaunching:(UIApplication *)application {application.statusBarHidden = YES;

    [self.window setRootViewController:self.tabBarController];


这解决了这个问题。

只需删除支持的界面方向的所有项目,除了你想要的(我只需要肖像)在info.plist,它会为我工作 在这里输入图像说明

只需调用[application setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; (BOOL)应用程序:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

实际上该设备现在是UIInterfaceOrientationPortrait启动后,如果你触摸一个inputField,那么键盘是肖像布局