21

アプリを iOS 7 に移行したときに、View Controller を表示すると、ナビゲーション バーがステータス バーの下に表示されます。多くの人がこの同じ問題に遭遇したと思います。これが私が見ているもののスクリーンショットです:

既存のナビ

要件:

  • 新しいビューは「モーダル」に表示される必要があります。つまり、presentViewController が必要です。

  • iOS 7 スタイルのナビゲーション バーの背景色をステータス バーに使用して、ある種のナビゲーション バーまたはツールバーを表示します。

  • iOS 6 で動作する必要があります。

  • 自動レイアウトを有効にして、xib を使用してレイアウトを処理しています。

オプション:

A. ビューのフレームを少し下に移動します。

うーん、私たちはiOS 5日前に戻ってフレームをいじっているのでしょうか? また、一般的に、autolayout と混合することはお勧めできません。

B. ナビゲーション バーの上部に少し隙間を追加します。

オプション A と B の欠点の 1 つは、ステータス バーがナビゲーションに溶け込まないことです。

隙間のあるナビ

C. プログラムで制約を追加します。

主な欠点は、制約をいじったり、ナビゲーション バーとステータス バーの高さを計算したりする必要があることです。うん。

D. ナビゲーション バー / ツールバーの高さを伸ばして、ステータス バーの領域を含める。

iOS 7 では見栄えがしますが、iOS 6 では機能しません。ナビゲーション バーの高さをプログラムで更新する必要があります。また、ビューの残りの部分が適切に更新されることを確認してください。混雑。

ここに画像の説明を入力

E. IB での iOS6/7 デルタの混乱。

複数の欠点: ios6/7 デルタをハードコーディングすることになります。また、自動レイアウトでは機能しません。

F. ネストされた UINavigationController を使用します。

これは私が選択した回避策です。以下の回答を参照してください。

uinavcontroller の回避策

4

4 に答える 4

29

私が見つけた最も簡単な回避策は、表示するビュー コントローラーをナビゲーション コントローラー内にラップしてから、そのナビゲーション コントローラーを表示することです。

MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc] 
    initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];

利点:

  • フレームをいじる必要はありません。
  • 同じコードが iOS 6 と iOS 7 で動作します。
  • 他の回避策よりも見苦しくありません。

短所:

  • XIB をナビゲーション バーやツールバーから空のままにし、UIBarButtonItems をプログラムでナビゲーション バーに追加することをお勧めします。幸いなことに、これは非常に簡単です。
于 2013-09-20T08:38:39.667 に答える
3

次のコードは私のために働いた。新しいコントローラーを提示しているコントローラーに配置するだけです。

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}
于 2013-11-20T23:59:55.283 に答える
0

xib ファイルを開き、viewcontroller を選択します。インスペクタータブで属性を選択し、トップバーの「不透明なナビゲーションバー」を選択します。これで問題は解決しました。

于 2013-09-20T09:19:38.200 に答える