以横向方式从iPhone 6 Plus主屏幕以纵向模式启动会导致错误的方向
这个问题的实际标题比我可能适合的长:
启动一个应用程序,其根视图控制器仅支持纵向,但在iPhone 6 Plus上支持横向方向,而主屏幕处于横向方向时,将导致应用程序的窗口处于横向方向,但该设备是在纵向方向。
总之,它看起来像这样:
当它应该是这样的:
重现步骤:
-
运行iOS 8.0的iPhone 6 Plus。
-
一个应用程序,其plist支持所有,但肖像颠倒的方向。
-
该应用程序的根视图控制器是一个UITabBarController。
-
一切,标签栏控制器及其所有后代子视图控制器从
supportedInterfaceOrientations
返回UIInterfaceOrientationMaskPortrait
。 -
从iOS主屏幕开始。
-
旋转到横向(需要iPhone 6 Plus)。
-
冷启动应用程序。
-
结果:界面取向破裂。
我想不出任何其他的方式来执行一个肖像方向, 除了完全禁用风景,我不能这样做:我们的网页浏览器模式视图控制器需要风景。
我甚至尝试了inheritanceUITabBarController并覆盖supportedInterfaceOrientations来返回肖像专用掩码,但是这个(即使是上面所有的其他步骤)也没有解决这个问题。
这是一个示例项目的链接,显示错误。
当我在iPhone 6 Plus的横向上启动我们的应用程序时遇到同样的问题。
我们的解决scheme是通过项目设置从plist中删除横向支持的界面方向:
并实现应用程序:supportedInterfaceOrientationsForWindow:在应用程序委托中:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskAllButUpsideDown; }
显然你的plist中的信息是指定你的应用程序允许启动的方向。
设置UIApplication
的statusBarOrientation
似乎适用于我。 我将它放在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,那么键盘是肖像布局