1. ホーム
  2. アイオス

[解決済み】iPhoneアプリでiOS 7のステータスバーをiOS 6のデフォルトスタイルに戻す?

2022-04-01 09:37:54

質問

iOS 7では UIStatusBar は、このようにビューと合体するように設計されています。

(GUIデザインは ティナ・タブチャール )

  • クールですが、ビューの上部に何かを表示したときに、ステータスバーと重なってしまい、ビューがやや乱れてしまいます。

  • iOS6での動作に戻すための簡単な解決策(info.plistのプロパティを設定するなど)はありますか?

  • もっとわかりやすい解決策は self.view.center.x + しかし、ビューコントローラを変更すると、他のディメンジョンが台無しになります(異なる self.view.center.x とか、カスタムセグに問題があるなど、突然面倒な仕事に変わってしまうので、避けた方が無難です。

  • どなたか、ワンライナーで解決できる方法を教えていただけると本当に嬉しいです。

追伸:ステータスバーを隠すには、以下のような方法があることは知っています。

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

didFinishLaunchingWithOptions しかし、これは回避策であり、問題を回避する近道なので、本当の解決策とは思えません。

解決方法は?

この記事は、以下のサイトから転載しています。 私が書いたブログ記事 しかし、ここではiOS 7のステータスバー、ナビゲーションバー、コンテナビューコントローラーについての完全な概要を説明します。

  1. iOS 6 スタイルのステータスバーのレイアウトを維持する方法はありません。iOS 7 では、ステータスバーは常にアプリケーションに重なります。

  2. ステータスバーの外観とステータスバーのレイアウトを混同しないでください。外観(ライトまたはデフォルト)はステータスバーのレイアウト方法(フレーム/高さ/オーバーラップ)に影響しません。また、システムステータスバーはもはや背景色を持たないことにも注意することが重要です。API が UIStatusBarStyleLightContent を参照する場合、クリアな背景に白いテキストを意味します。UIStatusBarStyleDefault は、透明な背景に黒いテキストです。

  3. ステータスバーの外観は、相互に排他的な2つの基本パスのいずれかで制御されます。従来の方法でプログラム的に設定するか、UIKitがUIViewControllerのいくつかの新しいプロパティに基づいてあなたのために外観を更新することができます。後者のオプションはデフォルトでオンになっています。アプリのplistの「ViewController-Based Status Bar Appearance」の値をチェックして、どちらを使っているか確認しましょう。この値をYESに設定すると、アプリ内のすべてのトップレベルのビューコントローラ(標準のUIKitコンテナビューコントローラ以外)はpreferredStatusBarStyleをオーバーライドして、デフォルトまたはライトスタイルを返す必要があります。plistの値をNOに編集すると、おなじみのUIApplicationメソッドを使用してステータスバーの外観を管理できるようになります。

  4. UINavigationControllerは、そのUINavigationBarの高さを44ポイントまたは64ポイントに変更しますが、これはかなり奇妙で文書化されていない制約のセットによって異なります。UINavigationController がビューのフレームの上部が UIWindow の上部と視覚的に連続することを検出した場合、64 ポイントの高さでナビゲーションバーを描画します。ビューの上部が UIWindow の上部と連続していない場合(1 ポイントだけずれている場合でも)、ナビゲーションバーは 44 ポイントの高さで「従来の」方法で描画されます。 このロジックは、UINavigationControllerがアプリケーションのビューコントローラー階層内のいくつかの子階層にある場合でも実行されます。 この動作を防ぐ方法はありません。

  5. 高さが 44 ポイント(88 ピクセル)しかないカスタムナビゲーションバーの背景画像を用意し、UINavigationController のビューの境界が UIWindow の境界と一致する場合(#4 で説明)、UINavigationController は画像をフレーム (0,20,320,44) に描き、カスタム画像の上に 20 ポイントの不透明の黒い空間を残します。これによって、自分はルール1を回避した賢い開発者だと勘違いしてしまうかもしれませんが、それは間違いです。ナビゲーションバーの高さは64ポイントのままです。UINavigationControllerをスライドして表示するスタイルのビュー階層に埋め込むと、このことがよくわかります。

  6. UIViewControllerのedgesForExtendedLayoutという紛らわしい名前のプロパティに注意してください。edgesForExtendedLayoutを調整しても、ほとんどの場合、何も起こらない。UIKitがこのプロパティを使う唯一の方法は、UINavigationControllerにビューコントローラを追加した場合、UINavigationControllerはedgesForExtendedLayoutを使ってその子ビューコントローラをナビゲーションバー/ステータスバー領域の下に表示するかどうかを決定することです。UINavigationController 自身に edgesForExtendedLayout を設定しても、UINavigationController のナビゲーションバー領域の高さが 44 ポイントか 64 ポイントかは、何も変わりません。このロジックについては、#4 を参照してください。ツールバーやUITabBarControllerを使用する場合、同様のレイアウトロジックがビューの下部にも適用されます。

  7. UINavigationController 内でカスタム子ビューコントローラーがナビゲーションバーの下に重ならないようにするためだけの場合は、edgesForExtendedLayout を UIRectEdgeNone(または少なくとも UIRectEdgeTop を除外したマスク)に設定します。この値は、ビューコントローラーのライフサイクルのできるだけ早い段階で設定します。

  8. UINavigationController と UITabBarController は、そのサブビュー階層にあるテーブルビューとコレクションビューの contentInsets もパッド化しようとします。これは、#4 で説明したステータスバーのロジックと似たような方法で行われます。これを防ぐには、テーブルビューとコレクションビューの automaticallyAdjustsScrollViewInsets を NO に設定します (デフォルトは YES です)。WhisperとRiposteでは、ツールバーやキーボードの動きに応じてテーブルビューのレイアウトを制御するためにcontentInsetの調整を使用しているため、これは深刻な問題となりました。

  9. 繰り返しになりますが、iOS 6スタイルのステータスバーのレイアウトロジックに戻す方法はありません。これを近似するためには、アプリのすべてのビューコントローラを、画面の上部から20ポイントオフセットしたコンテナビューに移動し、ステータスバーの背後に意図的に黒いビューを残して、古い外観をシミュレートする必要があります。この方法は、RiposteとWhisperで最終的に使用した方法です。

  10. Appleは、あなたが#9のようなことをしないように、非常に強く働きかけています。彼らは、すべてのアプリをステータスバーの下に重なるようにデザインし直せというのです。しかし、ユーザーエクスペリエンスと技術的な理由の両方から、これが常に良いアイデアとは限らないという説得力のある主張がたくさんあります。ユーザーにとってベストなことを行うべきで、単にプラットフォームの気まぐれに従うべきではありません。