私はすでに@slycrelによる回答に投票しましたが、時間をかけてこれを書き、この古い質問で失われているように思われるいくつかのことや、この主題に関する他の多くの質問を指摘したいと思います。
確かにAppleは、向きの変更に基づいてUIのほとんどを更新することを望んでいませんが、それでも完全に可能であり、ケースバイケースのシナリオで必要になることもあります。Appleが新しい(ish)を改善するまではそうなります。 API(たとえば、 .just sayin'viewWillTransitionToFrame:
よりもはるかに便利です)viewWillTransitionToSize:
UIDeviceOrientation
@slycrelで回答に投票した理由は、との論理的な違いとして覚えておく必要があることに関連していますUIInterfaceOrientation
。
ステータスバーは、アプリケーションの現在既知の状態を示しますUIInterfaceOrientation
。に関するこれらすべてのことは、デバイスの向きにのみ関連しており、必ずしもアプリケーションの向きに関連しているわけではありませんFaceUp
。とにかく、アプリケーションはデバイスの向きをサポートしていません。実際、インターフェイスで適切にレイアウトおよびアニメーション化するだけであれば、完全に無視できます。これは、アプリケーション開発者のユースケースの99%です。これは現在、@slycrelの回答のステータスバーで実現されています。FaceDown
UIDeviceOrientation
UIInterfaceOrientation
[UIApplication sharedApplication].statusBarOrientation
このプロパティの読み取り/書き込みバージョンは非推奨ですが、読み取り専用バージョンは非推奨ではないことに注意してください。
この例を見てください:
- すべてのインターフェイスの向きをサポートするアプリケーションと、それらをサポートするルートビューコントローラーがあります。
- 今、私は
UIViewController
ステータスバーの向きが横向きになる結果となるものを提示しています。
- どの横向き(左または右)に移動するかは
preferredInterfaceOrientationForPresentation
、そのView Controllerに対して返されるもの、現在のデバイスの向き、およびView Controllerがサポートするインターフェイスの向きに基づいています(次のポイントを参照)。
- このViewControllerは、によって返されるものに基づいて横向きのみをサポートするため、現在のデバイスの向きに関係なく、ステータスバーは横向きになります
supportedInterfaceOrientations
。で左右両方の風景をサポートするとしましょうUIInterfaceOrientationMaskLandscape
。
- また、このViewControllerを回転変換を使用して所定の位置に条件付きでアニメーション化します。これは、ポートレートまたはポートレートを逆さまにして、横向き左または横向き右に移動する場合にのみ必要になります。それ以外の場合は、回転のない、より単純なプレゼンテーションアニメーションになります。
- 次に、しばらくしてデバイスを使用した後、そのViewControllerを閉じます。
- 次に、別の回転変換を使用して、このViewControllerを画面から条件付きでアニメーション化します。これは、左の風景または右の風景から、縦向きまたは逆さまの縦向きに移動する場合にのみ必要になります。それ以外の場合は、回転のない、より単純な却下アニメーションになります。
- この時点で、ステータスバーの向きは、ルートビューコントローラーの優先インターフェイスの向きとサポートされているインターフェイスの向き、およびデバイスの現在の組み合わせに適切であるとシステムが判断したものになります
UIDeviceOrientation
。
- ビューコントローラはすべてのインターフェイスの向きをサポートするため、デバイスの向きがFaceUpまたはFaceDownの場合、に基づいて次の向きを確実に推測することはできず
UIInterfaceOrientation
UIDeviceOrientation
、とにかくそうする必要はありません。
- だから...救助へのステータスバーの向き!
ビューコントローラの遷移が開始されようとしているときにステータスバーの方向が更新されないため、前の例が可能です(システムは遷移デリゲートにアニメーターなどを要求します)。次に、トランジションがアニメーションを開始すると更新されます(たとえば、時間animationTransition:
が呼び出されるまでに)。このようにして、ステータスバーの初期値と現在の値を使用するだけで適切な比較ができるはずですUIInterfaceOrientation
。
ビューコントローラのトランジションを使用しなくても、ステータスバーの向きに基づいてビューを更新しても安全です。
ステータスバーを手動で更新していて、 Info.plistで「コントローラーベースのステータスバーの外観を表示」を使用していない場合は、アプリケーションのロジックがステータスバーの向きをいつ変更するかを認識している必要があることに注意してください。 。NSNotification
あなたはおそらくこれらの場合のいくつかの名前を探しているでしょう:それは次のとおりです:
UIApplicationWillChangeStatusBarOrientationNotification
UIApplicationDidChangeStatusBarOrientationNotification
これらのUIApplicationDelegate
方法と同様に:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
そして、この他の便利なUIApplication
プロパティ:
@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;