为什么在iOS 8中我的应用程序在启动时采取错误的方向

时间:2014-09-15 17:27:40

标签: ios ipad cocoa-touch uiinterfaceorientation

我的iOS 7应用程序正常运行。我今天尝试使用Xcode 6,当我运行它时,我有一个令人讨厌的惊喜:(:

enter image description here 您可以看到Xcode现在绘制我的viewController,就像它处于纵向模式一样,但正如您所看到的那样是横向模式。

你知道iOS 8中有什么变化吗? :/ 我使用了以下定位方法:

  • (NSUInteger)supportedInterfaceOrientations
  • (BOOL)shouldAutorotate
  • (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

编辑:

我发现这个方法:

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

现在我的第一个viewcontrollers工作正常:)。问题是当我显示一个模态(改变UIInterfaceOrientationMaskAll中的方法集)时重新制作截图的丑陋效果。 确切地说,我在这种模式下改变了我的方法:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if(self.restrictRotation)
    {
        return UIInterfaceOrientationMaskLandscape;
    }    
    else
    {
        return UIInterfaceOrientationMaskAll;
    }
}


// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
    NSLog(@"updateInterfaceAfterDocumentPreviewViewController");

    [[UIApplication sharedApplication]     setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];

    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = YES;
}

8 个答案:

答案 0 :(得分:16)

请尝试以下代码

didFinishLaunchingWithOptions的{​​{1}}

AppDelegate

答案 1 :(得分:8)

问题似乎是设置窗口时的调用顺序。在您的makeKeyAndVisible方法中为应用代表分配rootViewController之前,您需要致电didFinishLaunchingWithOptions。以下作品:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;

但如果您将订单更改为:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];

您会遇到您遇到的行为。

答案 2 :(得分:1)

我在“加载屏幕”中遇到了同样的问题。这对我有用。 (请注意:我的应用仅支持iOS 7或更高版本,横向模式。):

    CGRect theFrame = self.view.frame;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
        CGRect screenBounds = [[UIScreen mainScreen] bounds];
        theFrame.origin = CGPointZero;
        theFrame.size.width = screenBounds.size.height;
        theFrame.size.height = screenBounds.size.width;
    }

    NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
    self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];

如果您的应用支持纵向方向和“计算正确的applicationFrame的长路”,请参阅Mike Hay的答案: https://stackoverflow.com/a/18072095/4108485

希望这有帮助。

答案 3 :(得分:1)

查看您的.plist文件。

  1. 确保将“初始界面方向”设置为您想要的方向。
  2. 在“支持的界面方向”中,将首选方向作为列表中的第一个条目(看起来像Apple更改了此顺序)。

答案 4 :(得分:1)

我遇到了类似的问题,我无法获得正确的启动图像显示(我有两个用于iPad,Default-Portrait.png和Default-Landscape.png)我也无法获得应用程序本身启动图像消失后自动定位。

解决启动图像的问题:

  • 转到项目的自定义iOS目标属性部分(单击项目文件列表顶部的项目图标,它应该是您看到的第一部分。)
  • 在该表中添加一行名为“Launch image”(应自动填充)并输入“Default”作为右栏中的字符串。
    < / LI>
  • 确保您的启动图像遵循Apple的文件名指南(即:默认-568 @ 2x,默认@ 2x等) check this SO answer

首先解决应用方向问题ViewController:

  • 转到您的项目plist文件(应为“YourApp-Info.plist”)
  • 添加一行并输入“支持的界面方向”
  • 添加应用支持的方向

答案 5 :(得分:0)

检测方向的方法是deprecated in iOS8(但现在仍然允许)。 它被大小类和Trait Collections的概念所取代。

(奇怪的是,我现在似乎无法在Apple的在线文档中找到尺寸等级参考 - 会发誓它之前有过 - 可能在XCode中)。见here for WWDC videos.

无论如何,Interface Builder中有一个复选框,上面写着“Use Size Classes”。 可能你已经检查过了。关掉它&amp;看看这有帮助吗?

答案 6 :(得分:0)

Oldschool解决方案:

BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
    CGFloat height = CGRectGetHeight(self.view.frame);
    CGFloat width = CGRectGetWidth(self.view.frame);
    if (width / height > 1.0) {
        portrait = NO;
    } else {
        portrait = YES;
    }
} else {
    portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
    [self layoutPortrait];
} else {
    [self layoutLandscape];
}

您可以在viewWillLayoutSubviews

中调用此方法

答案 7 :(得分:0)

UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;

if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
    {
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

        // -- Fix for rotation issue for ios 8
        if( IS_IOS_8_OR_LATER )
        {
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
                                                                 bundle: nil];
            // -- Set frame of nav controller
            UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];

            self.window.rootViewController = nc;

            [self.window setFrame:[[UIScreen mainScreen] bounds]];

            // -- Set fame of home view controller
            UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];

            self.window.rootViewController = vc;

            [self.window makeKeyAndVisible];

            [self.window setFrame:[[UIScreen mainScreen] bounds]];
        }
    }
}