2014-09-23 17 views
56

对这个问题的实际标题的时间比我都不可能适合:在错误的方向发射到人像方向从横向结果的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. 结果:断开的接口方向。

我想不出任何其他方式强制执行纵向除了完全禁用的景观,这是我不能做:我们的网络浏览器模式视图控制器需要景观。

我甚至尝试了继承UITabBarController并重载supportedInterfaceOrientations来返回肖像专用掩码,但是这(甚至包括上述所有其他步骤)并未解决问题。


Here's a link to a sample project showing the bug.


+0

您是否向雷达提交了错误? – Pichirichi 2014-10-12 11:41:18

+0

贾斯廷米勒在苹果论坛上建议如下:“你的信息属性列表应该指定你愿意允许你的应用程序启动的方向(它应该对应于你的初始视图控制器支持的方向)。” – Pichirichi 2014-10-12 13:35:21

+0

我喜欢你构思这个问题的方式..我想知道如何把它解决。感谢您节省我的一天。 ! – 2014-12-04 13:47:29

回答

5

使用的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]; 
+0

这不幸的是不起作用。真正的解决方法是编辑Plist文件,以便它在启动时与您的应用程序预期行为相匹配。 – DJSK 2015-06-01 19:27:52

+0

@DJSK你能举一个例子怎么做?我正面临着与我的UITabBarController类似的问题。我想支持所有方向,但应用程序只能以纵向方向打开。 – atulkhatri 2016-11-22 09:00:55

1

请尝试下面的代码。 可能是由于keywindow尺寸在景观启动时造成的这个问题。

// in application:didFinishLaunchingWithOptions: ... 

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

不是。尝试附在本文末尾的示例项目以查看。 – jaredsinclair 2014-09-24 13:01:43

+0

对不起,我错过了示例项目。但是我通过在makeKeyAndVisible之后强制窗口框架来让项目正常工作。 – fumiaki 2014-09-25 00:45:39

+0

这对我有效,我没有使用UITabBarController。谢谢! – bdmontz 2014-10-23 18:44:15

0

至于我自己,我也有同样的问题,因为jaredsinclair,但与supportedInterfaceOrientations方法并没有解决问题的一个子类UIViewController。相反,我做了他在我的AppDelegateappDidFinishLaunching方法中所做的一切,并将我的UITabBarController作为孩子添加到正常的UIViewController而不是他的子类,并且它工作正常!

1

对我来说运气不好,Jared使用通用的容器视图控制器。我已经使用supportedInterfaceOrientations将选项卡栏控制器分类为不带运气。无论6+推出后标签栏的窗口的取向是报告frame = (0 0; 736 414)

到目前为止,我已经找到了唯一的解决方法是迫使窗框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)));

+0

这几乎可行。视图的方向以纵向正确显示,但状态栏仍然卡在横向上。 – DJSK 2015-06-01 19:03:55

0

我在相同的情况,并做[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]; 
35

设置的UIApplicationstatusBarOrientation似乎为我工作。我将它放在应用程序委托中的application:didFinishLaunchingWithOptions:方法中。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    application.statusBarOrientation = UIInterfaceOrientationPortrait; 

    // the rest of the method 
} 
+0

这工作对我来说,虽然我没有使用UITabBarController作为根视图控制器,其他答案建议是原始帖子的主要问题。 – SeanR 2014-10-20 00:22:43

+1

移动到 - (BOOL)应用程序:(UIApplication *)应用程序willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 如果使用状态恢复,效果会更好。 – 2014-11-21 17:31:25

+0

辉煌。帽子关!保存了我的一天。 – 2014-12-04 13:38:52

2

我有一个非常类似的问题。除了播放视频外,我想在任何地方强制使用人像模式。

我所做的是:

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]; 
} 
66

推出我们在景观应用程序时,我有同样的问题在iPhone 6 Plus上。

我们的修复是通过项目设置,从plist中的景观支持的接口方向:

Removed landscape orientation

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

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

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

+0

这为我做了诡计。该应用程序只能在允许的方向上启动,但随后的viewControllers可以旋转到“完全颠倒”,具体取决于您的VC指定的内容。谢谢! – 2015-04-20 19:48:02

+0

哇!非常感谢!!!这有助于我的情况:iPhone 6 Plus(设备OR模拟器)。我不得不支持所有旋转画廊的意见,但只有肖像的主要意见。如果启动应用程序,然后将其最小化,那么iPhone 6 Plus主屏幕将旋转至横向,然后再次打开应用程序 - 所有内容均为纵向,但通知中心/底部配置面板可从侧面向下/向上拉。 (并且iOS警报也出现了旋转)......这个修正了它! – 2015-04-30 15:37:14

+0

这是正确的,应该是被接受的答案。 – DJSK 2015-06-01 19:26:14

1

我只希望我的应用程序以横向模式打开(并且不会出现上述在iPhone 6 Plus中描述的问题),所以我将Landscape (left home button)Landscape (right home button)设置为我的应用程序的PLIST文件中允许的唯一方向。这会在我的应用程序打开时修复方向问题。不过,由于我在我的应用中显示UIImagePickerController,因此Apple需要在iPhone上以纵向模式显示,所以我需要我的应用支持一个视图的肖像模式。

我能够支持人像只有一个视图,同时保持在横向模式下我的应用程序开放,通过在AppDelegate下面的代码:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 

     return UIInterfaceOrientationMaskAllButUpsideDown; 

    } else { 

     return UIInterfaceOrientationMaskAll; 

    } 

} 
0

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

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

我只需要做的: - 删除XIB中的rootview控制器分配。 - 手动添加它在一旦应用启动:


  • (无效)的applicationDidFinishLaunching:(UIApplication的*)应用{ application.statusBarHidden = YES;

    [self.window setRootViewController:self.tabBarController];


这解决了这一问题。

0

只是删除在所支持的接口方向的所有项目,除了你想要的东西(我只需要肖像)在info.plist中,它会为我工作enter image description here

-1

就叫 [应用setStatusBarOrientation:UIInterfaceOrientationPortrait动画:NO] ; 在应用程序的委托方法 - (BOOL)申请:(UIApplication的*)应用程序didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions

其实设备现在是UIInterfaceOrientationPortrait启动后,如果你碰了一下inputField,键盘是纵向布局