5

アプリを iOS7 用に更新すると、UI がステータス バー領域内に表示されます。「私たちについて」と下の画像の検索ボタンをご覧ください。

ここに画像の説明を入力

iOS6 では、ステータス バーの下の正しい場所から開始されます。この UI は、ストーリーボードからではなく、プログラムで作成したことに注意してください。

以下の解決策を見つけてView Controllerに入れましたが、機能していません:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

rootViewControllerはタブバーです。運が悪かったので、次のことも試しました:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
    self.tabBarController.edgesForExtendedLayout = UIRectEdgeNone;
}

私の他のストーリーボードアプリでは、ボトムバーの下とトップバーの下で選択を解除することができました. ストーリーボードなしで同じ効果を得るにはどうすればよいですか?

4

4 に答える 4

23

これは私が書いたブログ投稿からクロスポストされたものですが、iOS 7 のステータス バー、ナビゲーション バー、およびコンテナー ビュー コントローラーの完全な概要は次のとおりです。

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

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

  3. ステータス バーの外観は、相互に排他的な 2 つの基本パスのいずれかに沿って制御されます。従来の方法でプログラムで設定するか、UIViewController のいくつかの新しいプロパティに基づいて UIKit が外観を更新します。後者のオプションはデフォルトでオンになっています。"ViewController-Based Status Bar Appearance" のアプリの plist 値をチェックして、どちらを使用しているかを確認します。この値を 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 ポイントのままです。Slide-to-reveal スタイルのビュー階層に UINavigationController を埋め込むと、これが非常に明確になります。

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

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

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

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

  10. Apple は、ユーザーが #9 を実行しようとしないことを確実にするために、非常に強く求めています。彼らは、ステータス バーの下に重なるようにすべてのアプリを再設計することを望んでいます。ただし、ユーザー エクスペリエンスと技術的な理由の両方から、これが必ずしも良い考えではない理由について、多くの説得力のある議論があります。単にプラットフォームの気まぐれに従うのではなく、ユーザーにとって最善のことを行う必要があります。

于 2013-09-24T13:06:50.577 に答える
3

どの OS ユーザーが使用しているかを確認した後、この行を AppDelegate に追加するだけです。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
}
于 2013-09-24T12:23:30.420 に答える
2

こんにちは、これがお役に立てば幸いです。このコードは私にとってはうまくいきます。このコードをViewDidLoadに貼り付けてください

    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;
于 2013-09-24T13:01:15.570 に答える