web-dev-qa-db-ja.com

ステータスバーは横長ですが、[[UIApplication sharedApplication] statusBarOrientation]は縦長を返します

この問題は断続的に発生するように見えますが、正確には理由がわかりません。デバイス(iPad)でアプリケーションを実行すると、現在のデバイスの向きに応じて、スクロールビューといくつかのイメージビューを読み込むコードがいくつかあります。ロード前のデバイスは横長ですが、ビューはポートレートのようにロードされています。

オリエンテーションは[[UIApplication sharedApplication] statusBarOrientation]を呼び出すことで見つかります。

ビューは、デバイスが回転したときに位置を調整するように設定されており、実際に回転して縦向きにしてから横向きに戻すと、正しい横向きの位置に戻ります。すべてのアプリケーションが縦向きで始まり、必要に応じてすぐに横向きに変わるのは事実ですか? (方向が最初に読み込まれるビューコントローラーのinitの間に)方向を確認しようとしていますか?

18
Stuart

UIWindowまたはステータスバーをサブクラス化している場合は、これが表示されます。これは、iPadデバイスのネイティブの向きだからです。 UIWindowは、向きと座標を慣れ親しんだものに変換します。 makeAndKeyVisibleを実行すると、View Controllerでのデバイスとインターフェイスの向きは期待どおりになります。あなたはたまたまMTStatusBarOverlayを使用していませんか?私は同じことを経験しました、そしてそれは状態のオーダーに行き着きました。

7
Greg Combs

OK修正済み

UINavigationControllerを使用して、popToViewController:animated:を横向きビューから縦向きビューに変更すると、宛先ビューは正しく表示されますが、ステータスバーとUIKeyboardが横向きの構成を維持し、実際の混乱を引き起こします。

回避策statusBarOrientationと参照に関する何千もの推奨事項を読んだ後... https://developer.Apple.com/library/content/ releasenotes/General/RN-iOSSDK-6_0/index.html

「setStatusBarOrientation:animated:メソッドは完全に非推奨ではありません。これは、最上部のフルスクリーンビューコントローラのsupportedInterfaceOrientationsメソッドが0を返す場合にのみ機能するようになりました。これにより、呼び出し元はステータスバーの向きが一貫していることを確認する必要があります。」 (ありがとう Vytis ここにあります)

statusBarOrientationは、supportedInterfaceOrientationsが0を返した場合にのみ機能するので、推測できます。

StatusBarOrientationが期待どおりでない場合、1つのゼロを返すとそれが行われます(常に0を返す場合、ビューは回転しません。

// if deviceOrientation is A (so I expect statusbarOrientation A
// but statusbarOrientation is B
// return 0
// otherwise 
// return user interface orientation for A

- (NSUInteger)supportedInterfaceOrientations {
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    UIInterfaceOrientation statusBarOrientation =[UIApplication sharedApplication].statusBarOrientation;
    if(deviceOrientation == UIDeviceOrientationPortrait || deviceOrientation == UIDeviceOrientationPortraitUpsideDown){
        if(statusBarOrientation != UIInterfaceOrientationPortrait ||statusBarOrientation != UIInterfaceOrientationPortraitUpsideDown){
             return 0;
        }
    }
    // otherwise
    return UIInterfaceOrientationMaskPortrait;
}

今、viewDidAppear(私を信じて、キーボード通知が受信されたときでもこの呼び出しを使用します:

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;

これで48時間以上の労働時間。すべてのおかげで、これがしばらくの間役立つことを願っています。

35

他の誰かがこれに遭遇した場合に備えて、iOS5、実際にはiPhoneで同様の問題がある多くのアプリを目にします。

IOS 5のバグか、一般的な動作への干渉の可能性があります...

私はカスタムルートビューコントローラークラス(UITabBarControllerサブクラス、それが重要かどうかわからない)を使用し、そのクラスで "shouldAutorotateToInterfaceOrientation"をオーバーライドして、最初の画面設定が完了した後でのみ回転を開始します(他の方法では混乱を招きます)。

私が今やっていることは、このクラスを再利用して、回転を許可する前にstatusBarOrientationを手動で縦に設定し、UIが後で回転するものに設定することです。

[[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation animated:YES];

原因が無関係である場合でも、これでこの問題も修正できると思います。

4
coolio

起動時にこの問題が発生している場合、statusBarOrientationはapplication:didFinishLaunchingWithOptions:の後まで常に縦長であるため、UIDeviceを使用してデバイスの向きを取得する必要があります。唯一の注意点は、事前にデバイスの向きの通知を有効にするか、UIDeviceに向きを尋ねる必要があることです。

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
1
Mark Krenek

これらすべてがinfo.plistにあることを確認しましたか?

<key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
0
honcheng