web-dev-qa-db-ja.com

iOS 8で、起動時のアプリの向きが間違っているのはなぜですか?

iOS 7までの私のアプリは正しく動作します。私は今日Xcode 6でそれを試しました、そしてそれを実行すると私は厄介な驚きがあります:(:

enter image description here XcodeがmyViewControllerを縦長モードであるかのように描画していることがわかりますが、横長モードであることがわかります。

IOS 8で何が変更されたか知っていますか? :/私は次の方向付け方法を使用しました:

  • (NSUInteger)supportedInterfaceOrientations
  • (BOOL)自動回転する必要があります
  • (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;
}
24
user3914418

次のコードを試してください

didFinishLaunchingWithOptions/AppDelegate

self.window.rootViewController = self.viewController;

[self.window makeKeyAndVisible];

[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
16
chonbo

問題は、ウィンドウを設定するときの呼び出しの順序のようです。アプリデリゲートの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];

あなたはあなたが経験している行動を得る。

9
Dave Kammeyer

.plistファイルを見てください。

  1. 「初期インターフェースの向き」が希望の向きに設定されていることを確認してください。
  2. 「サポートされているインターフェースの向き」で、リストの最初のエントリとして優先する向きを指定します(Appleがこの順序を変更したように見えます)。
1
benaneesh

「読み込み画面」でもまったく同じ問題が発生しました。これは私のために働いたものです。 (ご注意ください:私のアプリは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

お役に立てれば。

1
l3bel

私は同様の問題を抱えていて、正しい起動画像を表示できなかった(iPadにはDefault-Portrait.pngとDefault-Landscape.pngの2つがあった)し、アプリ自体を自動方向付けすることもできませんでした。起動画像が消えた後。

起動画像の問題を解決するには:

  • プロジェクトのカスタムiOSターゲットプロパティセクションに移動します(プロジェクトファイルのリストの上部にあるプロジェクトのアイコンをクリックすると、最初に表示されるセクションになります)。
  • そのテーブルに "Launch image"(自動入力する必要があります)という行を追加し、右側の文字列として "Default"を入力しますカラム。
  • 起動画像がAppleのファイル名ガイドラインに準拠していることを確認してください(例:Default-568 @ 2x、Default @ 2xなど)これを確認SO回答

最初のViewControllerでアプリの向きの問題を解決するには:

  • プロジェクトのplistファイルに移動します(「YourApp-Info.plist」である必要があります)
  • 行を追加し、「サポートされているインターフェイスの向き」を入力します
  • アプリがサポートする向きを追加します
1
a.scarlett

オールドスクールソリューション:

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で呼び出すことができます

0
Avi Cohen

方向を検出するためのそのアプローチは iOS8 で廃止されました(ただし、今のところ許可されています)。これは、サイズクラスと Traitコレクション の概念に置き換えられました。

(奇妙なことに、現時点ではオンラインのAppleのドキュメントでサイズクラスリファレンスを見つけることができないようです-以前にあったと断言します-多分XCodeで)。 WWDCビデオについては こちらをご覧ください

とにかく、インターフェイスビルダーには「 Use Size Classes 」というチェックボックスがあります。チェックされている可能性があります。それをオフにして、それが役立つかどうかを確認しますか?

0
mc01
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]];
        }
    }
}
0
Joshua Haws