441

最近、iOS 7 でアプリをテストするためにXcode 5 DP をダウンロードしました。最初に気づいて確認したことは、ビューの境界が常にステータス バーとナビゲーション バーを考慮してサイズ変更されていないことです。

ではviewDidLayoutSubviews、ビューの境界を出力します。

{{0, 0}, {320, 568}}

これにより、コンテンツがナビゲーション バーとステータス バーの下に表示されます。

メイン画面の高さを取得し、ステータス バーの高さとナビゲーション バーの高さを差し引いて、高さを自分で説明できることはわかっていますが、それは不必要な余分な作業のように思えます。

この問題を解決するにはどうすればよいですか?

アップデート:

この特定の問題の解決策を見つけました。ナビゲーション バーの半透明プロパティを NO に設定します。

self.navigationController.navigationBar.translucent = NO;

これにより、ビューがナビゲーション バーとステータス バーの下に表示されなくなります。

ただし、ナビゲーション バーを半透明にしたい場合の修正方法は見つかりませんでした。たとえば、写真を全画面表示する場合、ナビゲーション バーを半透明にし、その下にビューをフレームで表示したいと考えています。それは機能しますが、ナビゲーション バーの表示/非表示を切り替えると、さらに奇妙な結果が発生しました。最初のサブビュー (UIScrollView) は、毎回変更される境界と原点を取得します。

4

20 に答える 20

498

edgesForExtendedLayoutこれは、iOS7 SDK で呼び出される新しいプロパティを実装することで実現できます。これを実現するには、次のコードを追加してください。

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

メソッドに上記を追加する必要があります-(void)viewDidLoad

iOS 7 では、 UIの外観をレイアウトおよびカスタマイズする方法がいくつか変更されています。ビュー コントローラーのレイアウト、色合い、フォントの変更は、アプリ内のすべてのUIKitオブジェクトに影響します。さらに、ジェスチャ レコグナイザー API の機能強化により、ジェスチャ インタラクションをより細かく制御できます。

ビュー コントローラの使用

iOS 7 では、View Controller はフルスクリーン レイアウトを使用します。同時に、iOS 7 では、View Controller がビューをレイアウトする方法をより細かく制御できます。特に、フルスクリーン レイアウトの概念が改良され、View Controller がビューの各エッジのレイアウトを指定できるようになりました。

The wantsFullScreenLayoutview controller property is deprecated in iOS 7. 現在 を指定するwantsFullScreenLayout = NOと、View Controller が iOS 7 で実行されたときに、予期しない画面の場所にコンテンツが表示される場合があります。

ビュー コントローラがビューをレイアウトする方法を調整するためにUIViewController 、次のプロパティを提供します。

  • edgeForExtendedLayout

このedgesForExtendedLayoutプロパティは、UIRectEdgeなしとすべてを指定するだけでなく、四角形の 4 つのエッジのそれぞれを指定するタイプを使用します。edgesForExtendedLayoutバーの半透明性に関係なく、ビューのどのエッジを延長するかを指定するために使用します。デフォルトでは、このプロパティの値は ですUIRectEdgeAll

  • extendedLayoutIncludesOpaqueBars

デザインで不透明なバーを使用する場合は、プロパティを NOedgesForExtendedLayoutに設定して調整します。( のデフォルト値はNOです。)extendedLayoutIncludesOpaqueBarsextendedLayoutIncludesOpaqueBars

  • 自動調整ScrollViewInsets

スクロール ビューのコンテンツ インセットを自動的に調整したくない場合は、NOautomaticallyAdjustsScrollViewInsetsに設定します。( のデフォルト値はYESです。)automaticallyAdjustsScrollViewInsets

  • topLayoutGuide、bottomLayoutGuide

およびプロパティは、View Controller のビューでのバーの上端または下端の位置を示しますtopLayoutGuidebottomLayoutGuideバーがビューの上部または下部に重なる必要がある場合は、Interface Builder を使用してtopLayoutGuide、bottomLayoutGuide の下部または上部に制約を作成することにより、バーを基準にしてビューを配置できます。(バーがビューに重ならない場合、 の下部は topLayoutGuideビューの上部と同じであり、 の上部はビュー bottomLayoutGuideの下部と同じです。) 両方のプロパティは、要求時に遅延して作成されます。

参照してください、アップルのドキュメント

于 2013-09-13T11:52:01.243 に答える
112

すべてをどれだけ下にシフトするかを計算する必要はありません。これには組み込みのプロパティがあります。Interface Builder で、ビュー コントローラーを強調表示してから、属性インスペクターに移動します。ここでは、"Extend Edges" という言葉の横にいくつかのチェック ボックスが表示されます。ご覧のとおり、最初のスクリーンショットでは、コンテンツが上部と下部のバーの下に表示されるようにデフォルトで選択されていますが、不透明なバーの下には表示されません。

最初のスクリーンショットでわかるように、ナビゲーション バーの下に 2 つの UI 要素が隠れています。(これを説明するために IB でワイヤーフレームを有効にしました) これらの要素、UIButton と UISegmentedControl はどちらも "y" 原点がゼロに設定されており、ビュー コントローラーはトップ バーの下のコンテンツを許可するように設定されています。

ここに画像の説明を入力

この 2 番目のスクリーンショットは、[トップ バーの下] チェック ボックスをオフにするとどうなるかを示しています。ご覧のとおり、ビュー コントローラー ビューは、y 原点がナビゲーション バーの真下になるように適切に下に移動されています。

ここに画像の説明を入力

これは、 を使用してプログラムで実行することもできます-[UIViewController edgesForExtendedLayout]これは、 edgeForExtendedLayoutおよびUIRectEdgeのクラス リファレンスへのリンクです。

[self setEdgesForExtendedLayout:UIRectEdgeNone];
于 2013-09-13T11:56:25.280 に答える
10

ビューに半透明のナビゲーション バーを表示したい場合 (これは便利です)、contentInset などを設定する必要があります。

これが私がそれを行う方法です:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}
于 2013-09-13T09:16:08.053 に答える
9

アプリの plist ファイルに行を追加し、「コントローラーベースのステータスバーの外観を表示」と呼び、NOに設定します。

于 2013-09-19T13:45:32.030 に答える
9

edgesForExtendedLayoutしかし、iOS 7 SDK でアプリをビルドして iOS 6 にデプロイすると、ナビゲーション バーが半透明になり、ビューがその下に表示されます。したがって、iOS 7 と iOS 6 の両方で修正するには、次のようにします。

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
于 2013-09-21T05:18:57.170 に答える
7

最も簡単な方法は、 NIBファイルを開いて次の 2 つの簡単な手順を実行することです。

  1. それを切り替えて、好みのものに設定してください:

ここに画像の説明を入力してください

  1. 下に移動したい UIView/UIIMageView/... を選択します。私の場合、ロゴのみが重なっていて、デルタを +15 に設定しました。(または、手順 1 で iOS 7 を選択した場合は -15)

ここに画像の説明を入力してください

そして結果

前 後

于 2013-09-20T10:27:26.743 に答える
5

迅速な解決策:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}
于 2015-07-21T17:06:30.220 に答える
2

このようにトップレイアウトに制約を加えます ここに画像の説明を入力

于 2015-09-10T09:00:04.943 に答える
2

スウィフト 4.2 - Xcode 10.0 - iOS 12.0:

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}
于 2018-08-25T12:18:23.950 に答える
1

iPad(armv7、armv7s、amr64)によるアプリで同じ問題が発生したのは、別の UIViewController を提示することだけであり、それらを閉じた後、ステータスバーの下にナビゲーションバーが表示されます...その解決策を見つけるのに多くの時間を費やしています。私はストーリーボードを使用しており、UIViewController の InterfaceBuilder で使用しているため、FullScreen -> Current Context からプレゼンテーションを設定すると、この問題が修正されます。私のアプリでは、iPad => iOS8.0 (iOS8.1 でテスト中) でのみ機能し、iOS 7.1 を搭載した iPad では機能しません!!スクリーンショットを見る

于 2015-01-30T09:52:31.443 に答える
1

の行として、ドロップダウン リストからキー「View Controller ベースのステータス バーの外観」を追加しますinfo.plist。このようなもの:

ここに画像の説明を入力してください

于 2013-09-23T21:17:24.043 に答える
0

iOS 7 でステータス バーを非表示にする手順:

1. アプリケーションの info.plist ファイルに移動します。

2.設定、コントローラーベースのステータスバーの外観の表示:ブール値NO

ステータスバーの問題が解決したことを願っています.....

于 2014-01-30T11:46:13.300 に答える