web-dev-qa-db-ja.com

ステータスバーを重ねずにiOS7でビューコントローラーを表示する方法

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

existing nav

要件:

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

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

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

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

オプション:

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

うーん、iOS 5以前の日に戻って、フレームをいじくり回していますか?また、一般に、自動レイアウトと混合することはお勧めできません。

B.ナビゲーションバーの下の上部に少しギャップを追加します。

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

nav with gap

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

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

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

IOS 7ではうまく見えますが、iOS 6では機能しません。ナビゲーションバーの高さをプログラムで更新する必要があります。また、ビューの残りの部分も適切に更新する必要があります。乱雑。

enter image description here

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

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

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

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

uinavcontroller workaround

20
bobics

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

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

利点:

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

短所:

  • おそらく、XIBにナビゲーションバーまたはツールバーを空のままにして、プログラムによってUIBarButtonItemsをナビゲーションバーに追加します。幸いなことに、これは非常に簡単です。
27
bobics

垂直制約を最上部のビューから上部レイアウトガイドに追加する必要があります-)Appleによる次の記事で説明されています。

https://developer.Apple.com/library/ios/qa/qa1797/_index.html

enter image description here

7
Yas T.

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

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}
2
Jwlyan

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

0
thorb65