この問題は断続的に発生するように見えますが、正確には理由がわかりません。デバイス(iPad)でアプリケーションを実行すると、現在のデバイスの向きに応じて、スクロールビューといくつかのイメージビューを読み込むコードがいくつかあります。ロード前のデバイスは横長ですが、ビューはポートレートのようにロードされています。
オリエンテーションは[[UIApplication sharedApplication] statusBarOrientation]
を呼び出すことで見つかります。
ビューは、デバイスが回転したときに位置を調整するように設定されており、実際に回転して縦向きにしてから横向きに戻すと、正しい横向きの位置に戻ります。すべてのアプリケーションが縦向きで始まり、必要に応じてすぐに横向きに変わるのは事実ですか? (方向が最初に読み込まれるビューコントローラーのinit
の間に)方向を確認しようとしていますか?
UIWindowまたはステータスバーをサブクラス化している場合は、これが表示されます。これは、iPadデバイスのネイティブの向きだからです。 UIWindowは、向きと座標を慣れ親しんだものに変換します。 makeAndKeyVisibleを実行すると、View Controllerでのデバイスとインターフェイスの向きは期待どおりになります。あなたはたまたまMTStatusBarOverlayを使用していませんか?私は同じことを経験しました、そしてそれは状態のオーダーに行き着きました。
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時間以上の労働時間。すべてのおかげで、これがしばらくの間役立つことを願っています。
他の誰かがこれに遭遇した場合に備えて、iOS5、実際にはiPhoneで同様の問題がある多くのアプリを目にします。
IOS 5のバグか、一般的な動作への干渉の可能性があります...
私はカスタムルートビューコントローラークラス(UITabBarControllerサブクラス、それが重要かどうかわからない)を使用し、そのクラスで "shouldAutorotateToInterfaceOrientation"をオーバーライドして、最初の画面設定が完了した後でのみ回転を開始します(他の方法では混乱を招きます)。
私が今やっていることは、このクラスを再利用して、回転を許可する前にstatusBarOrientationを手動で縦に設定し、UIが後で回転するものに設定することです。
[[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation animated:YES];
原因が無関係である場合でも、これでこの問題も修正できると思います。
起動時にこの問題が発生している場合、statusBarOrientationはapplication:didFinishLaunchingWithOptions:の後まで常に縦長であるため、UIDeviceを使用してデバイスの向きを取得する必要があります。唯一の注意点は、事前にデバイスの向きの通知を有効にするか、UIDeviceに向きを尋ねる必要があることです。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
これらすべてがinfo.plistにあることを確認しましたか?
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>