ios-以横向模式从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. 结果:界面方向损坏。

除了完全禁用横向之外,我没有其他强制纵向方式的方法,而我不能这样做:我们的Web浏览器模态视图控制器需要横向。

我什至尝试对UITabBarController进行子类化并覆盖supportedInterfaceOrientations以返回仅肖像的蒙版,但这(即使使用了上述所有其他步骤)也未能解决问题。


这是显示该错误的示例项目的链接。


13个解决方案
76 votes

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

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

Removed landscape orientation

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

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

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

Stefan Church answered 2019-10-08T06:59:13Z
38 votes

设置UIApplicationstatusBarOrientation似乎对我有用。 我将其放置在应用程序委托的application:didFinishLaunchingWithOptions:方法中。

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

    // the rest of the method
}
neilvillareal answered 2019-10-08T06:59:38Z
6 votes

使用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];
jaredsinclair answered 2019-10-08T07:00:04Z
2 votes

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

我所做的是:

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];
}
Eurico Doirado answered 2019-10-08T07:00:50Z
1 votes

请尝试以下代码。此问题可能是由横向启动时的键窗口大小引起的。

// in application:didFinishLaunchingWithOptions: ...

self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //<- ADD!!
fumiaki answered 2019-10-08T07:01:17Z
1 votes

对于我来说,Jared使用通用容器视图控制器的解决方法不走运。 我已经用supportedInterfaceOrientations对选项卡栏控制器进行了子类化,也没有运气。 无论启动后6+的方向如何,选项卡栏的窗口都会报告[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)));

到目前为止,我发现的唯一解决方法是在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)));

Anthony answered 2019-10-08T07:01:56Z
1 votes

我只希望我的应用程序以横向模式打开(并且不出现您在iPhone 6 Plus上描述的问题),因此我将Landscape (left home button)AppDelegate设置为我的应用程序的PLIST文件中允许的唯一方向。 这可以解决我的应用程序打开时的方向问题。 但是,仅在我的应用程序中显示UIImagePickerController时,我才需要我的应用程序支持一个视图的纵向模式,而Apple要求在iPhone上以纵向模式显示。

通过在AppDelegate中包含以下代码,我能够仅在一个视图中支持纵向视图,同时保持应用以横向模式打开:

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

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {

        return UIInterfaceOrientationMaskAllButUpsideDown;

    } else {

        return UIInterfaceOrientationMaskAll;

    }

}
Jack answered 2019-10-08T07:02:29Z
1 votes

我在我的应用程序上遇到了同样的错误,我通过此解决方案弄清楚了

首先,它不起作用,但是经过一番挖掘之后,我必须在启动屏幕之后在初始控制器上进行操作。

答案是OjbC语言,让我将其更新为Swift

override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

不要忘记,这应该在初始视图控制器上进行。

Gürhan KODALAK answered 2019-10-08T07:03:16Z
0 votes

就我自己而言,我遇到了与jaredsinclair相同的问题,但是用supportedInterfaceOrientations方法子类化UIViewController并不能解决问题。 相反,我完全按照他在appDidFinishLaunching中的AppDelegate方法中所做的那样做,并且将我的UITabBarController作为一个孩子添加到了普通的UIViewController中,而不是他的子类中,它起作用了!

Will answered 2019-10-08T07:03:45Z
0 votes

我处于相同的情况,对我来说[self.window setFrame:...]不起作用。

我发现唯一在工作结束时添加以下内容:didFinishLaunchingWithOptions。 它使屏幕闪烁,并且不是完全干净有效。

我在application: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];
James Grote answered 2019-10-08T07:04:26Z
0 votes

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

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

我要做的就是:-在XIB中删除rootview控制器分配。-应用启动后手动添加:


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

    [self.window setRootViewController:self.tabBarController];


这解决了问题。

de-bits answered 2019-10-08T07:05:28Z
0 votes

只需删除info.plist中您想要的(我只需要纵向)以外的所有受支持界面方向的项目,它将对我有用enter image description here

abdul sathar answered 2019-10-08T07:05:55Z
-1 votes

只是打电话[应用程序setStatusBarOrientation:UIInterfaceOrientationPortrait动画:否];在应用程序委托方法中-(BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

实际上,启动后设备现在是UIInterfaceOrientationPortrait,如果您触摸inputField,则键盘是纵向布局

NYZ_Star answered 2019-10-08T07:06:30Z
translate from https://stackoverflow.com:/questions/26003086/launching-into-portrait-orientation-from-an-iphone-6-plus-home-screen-in-landsca