web-dev-qa-db-ja.com

iPhone 6 Plusのホーム画面から横向きで縦向きに起動すると、間違った向きになります

この質問の実際のタイトルは、私がおそらく収まらないほど長いです。

ルートビューコントローラーが縦向きのみをサポートするが、ホーム画面が横向きのときにiPhone 6 Plusで横向きをサポートするアプリを起動すると、アプリのウィンドウは横向きであるがデバイスは横向きの状態になります縦向きで。

つまり、次のようになります。

次のようになっている場合:

再現手順:

  1. iOS 8.0を実行しているiPhone 6 Plus。

  2. Plistが縦向き以外のすべての方向をサポートするアプリ。

  3. アプリのルートビューコントローラーはUITabBarControllerです。

  4. すべて、Tab Bar Controllerおよびそのすべての子孫View Controllerは、UIInterfaceOrientationMaskPortraitからsupportedInterfaceOrientationsを返します。

  5. IOSのホーム画面から開始します。

  6. 横向きに回転します(iPhone 6 Plusが必要です)。

  7. アプリをコールド起動します。

  8. 結果:インターフェースの向きが壊れています。

横向きを完全に無効にするために、縦向きexceptを強制する他の方法は考えられません。

UITabBarControllerをサブクラス化して、supportedInterfaceOrientationsをオーバーライドしてポートレート専用マスクを返すことも試みましたが、これは(上記の他のすべてのステップでも)問題を修正しませんでした。


バグを示すサンプルプロジェクトへのリンクです。


59
jaredsinclair

これは、UITabBarControllerをルートビューコントローラーとして使用する場合のiOS 8のバグのようです。回避策は、主にVanilla UIViewControllerをルートビューコントローラーとして使用することです。このVanilla View Controllerは、Tab Bar Controllerの親View Controllerとして機能します。

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

IPhone 6 Plusで横向きでアプリを起動したときにも同じ問題がありました。

私たちの修正は、プロジェクト設定を介してplistからランドスケープをサポートするインターフェイスの向きを削除することでした:

Removed landscape orientation

アプリのデリゲートでapplication:supportedInterfaceOrientationsForWindow:を実装します。

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

どうやらplistの情報は、アプリの起動を許可する方向を指定することです。

78
Stefan Church

statusBarOrientationUIApplicationを設定すると、うまくいくようです。アプリのデリゲートのapplication:didFinishLaunchingWithOptions:メソッドに配置しました。

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

    // the rest of the method
}
38
neilvillareal

私は非常に似た問題を抱えていました。ビデオを再生することを除いて、どこでもポートレートモードを強制したかった。

私がしたことは:

1)AppDelegateでアプリの向きを強制的に縦向きにするには:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if ([window.rootViewController.presentedViewController isKindOfClass:[MPMoviePlayerViewController class]])
    {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

2)空のモーダルView Controllerを起動すると、私の場合の問題が修正されました。 NavigationViewController(アプリケーションの起動後に表示される最初のView Controller)のルートにある最初のView ControllerのviewDidLoadで起動します:

- (void)showAndHideNamelessViewControllerToFixOrientation {
    UIViewController* viewController = [[UIViewController alloc] init];
    [self presentViewController:viewController animated:NO completion:nil];
    [viewController dismissViewControllerAnimated:NO completion:nil];
}
2
Eurico Doirado

次のコードを試してください。おそらく、この問題は、ランドスケープ起動時のキーウィンドウのサイズが原因です。

// in application:didFinishLaunchingWithOptions: ...

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

アプリをランドスケープモードでのみ開きたい(そして、iPhone 6 Plusで上記の問題が発生しない)ため、Landscape (left home button)およびLandscape (right home button)を唯一の向きとして設定します私のアプリのPLISTファイル。これにより、アプリを開いたときの向きの問題が修正されます。ただし、アプリでUIImagePickerControllerを表示するため、1つのビューでのみポートレートモードをサポートする必要があります。これは、iPhoneでポートレートモードで表示する必要があるAppleが必要です。

次のコードをAppDelegateに含めることで、アプリを横長モードで開いたまま、その1つのビューのみのポートレートをサポートできました。

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

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {

        return UIInterfaceOrientationMaskAllButUpsideDown;

    } else {

        return UIInterfaceOrientationMaskAll;

    }

}
1
abcd

一般的なコンテナビューコントローラを使用したJaredによる回避策は、私には運がありません。運のないsupportedInterfaceOrientationsを備えたTab Bar Controllerを既にサブクラス化しています。起動後の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)));

1
Anthony

私はアプリで同じバグを見つけましたが、これで解決しました ソリューション

最初はうまくいきませんでしたが、いくつかの掘り出しの後、スプラッシュ画面の後に最初のコントローラーでそれをしなければなりません。

答えはOjbC言語で、Swiftに更新できます

override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

それが最初のView Controllerにあることを忘れないでください。

1
Gürhan KODALAK

私も同じ状況にあり、[self.window setFrame:...]を実行してもうまくいきません。

Application: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];
0
James Grote

私にとっては、jaredsinclairと同じ問題を抱えていましたが、UIViewControllersupportedInterfaceOrientationsメソッドでサブクラス化しても問題は解決しませんでした。代わりに、私のappDidFinishLaunchingAppDelegateメソッドで彼がやったことを正確に行い、サブクラスではなく通常のUITabBarControllerの子としてUIViewControllerを追加しました。出来た!

0
Will

Info.plistで必要なもの(Portraitのみが必要)を除く、サポートされているインターフェイスの向きのすべてのアイテムを削除するだけで、私にとっては機能します enter image description here

0
abdul sathar

同様の問題がありました。UITabBarControllerをルートビューコントローラーとして使用して、アプリをランドスケープとポートレートの両方で実行します。

横向きモードでアプリを起動すると、表示が正しくありませんでした。

私がしなければならなかったすべて:-XIBでrootviewコントローラーの割り当てを削除します。 -アプリが起動したら、手動で追加します。


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

    [self.window setRootViewController:self.tabBarController];


これで問題は解決しました。

0
de-bits