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

时间:2014-09-23 19:22:16

标签: ios iphone ios8 uiinterfaceorientation

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

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

简而言之,它看起来像这样:

如果看起来像这样:

重现步骤:

  1. 运行iOS 8.0的iPhone 6 Plus。

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

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

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

  5. 从iOS主屏幕开始。

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

  7. 冷启动应用程序。

  8. 结果:界面方向损坏。

  9. 我想不出任何其他方法来强制执行纵向方向除了以完全禁用格局,我不能这样做:我们的网络浏览器模态视图控制器需要格局。

    我甚至尝试了对UITabBarController进行子类化并重写supportedInterfaceOrientations以返回仅限纵向的掩码,但是这(即使使用上述所有其他步骤)也没有解决问题。


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


13 个答案:

答案 0 :(得分:77)

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

我们的修复方法是通过项目设置从plist中删除横向支持的界面方向:

Removed landscape orientation

并实现应用程序:supportedInterfaceOrientationsForWindow:在app delegate中:

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

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

答案 1 :(得分:38)

设置statusBarOrientation的{​​{1}}似乎对我有用。我将它放在app delegate中的UIApplication方法中。

application:didFinishLaunchingWithOptions:

答案 2 :(得分:6)

当使用UITabBarController作为根视图控制器时,这似乎是iOS 8中的错误。解决方法是使用大多数香草UIViewController作为根视图控制器。此vanilla视图控制器将用作选项卡栏控制器的父视图控制器:

///------------------------
/// 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];

答案 3 :(得分:2)

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

我做的是:

1)在AppDelegate中强制app方向为纵向:

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

答案 4 :(得分:1)

请尝试以下代码。 可能这个问题是由景观发布时的关键窗口大小引起的。

// in application:didFinishLaunchingWithOptions: ...

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

答案 5 :(得分:1)

Jared使用通用容器视图控制器解决了这个问题。我已经使用supportedInterfaceOrientations对tab bar控制器进行了子类化,但也没有运气。无论启动后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)));

答案 6 :(得分: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;

    }

}

答案 7 :(得分:1)

我在我的应用上遇到了同样的错误,我用这个solution

想出来了

首先它没有用,但经过一些挖掘后我必须在启动画面后在初始控制器上进行。

答案是OjbC语言让我把它更新为Swift

override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

不要忘记在初始视图控制器上应该这样做。

答案 8 :(得分:0)

对于我自己,我遇到了与jaredsinclair相同的问题,但是使用UIViewController方法对supportedInterfaceOrientations进行子类化并没有解决问题。相反,我完全按照我appDidFinishLaunching的{​​{1}}方法做了,并将我的AppDelegate作为一个孩子添加到普通UITabBarController而不是他的子类中,并且它有效! / p>

答案 9 :(得分: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];

答案 10 :(得分:0)

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

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

我所要做的一切: - 删除XIB中的rootview控制器分配。 - 启动应用程序后手动添加它:


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

    [self.window setRootViewController:self.tabBarController];


解决了这个问题。

答案 11 :(得分:0)

只需删除支持界面方向中的所有项目,除了您想要的内容(我只需要肖像)在info.plist中,它将适用于我enter image description here

答案 12 :(得分:-1)

只需打电话 [application setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 在app委托方法中 - (BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

实际上设备现在是启动后的UIInterfaceOrientationPortrait,如果你触摸一个inputField,键盘就是纵向布局