supported iOS 7 でステータス バーとナビゲーション バーがビューの境界上に表示される




iphone version (16)

iOS 10以降のNIB / XIBファイルでも動作するSwift 3 / Swift 4ソリューション:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

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

viewDidLayoutSubviewsでは、私はビューの境界を印刷します:

{{0、0}、{320、568}}

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

メイン画面の高さを取得し、ステータスバーの高さとナビゲーションバーの高さを引いて、高さを自分自身で考慮することができますが、それは不要な余分な作業のようです。

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

更新:

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

self.navigationController.navigationBar.translucent = NO;

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

しかし、ナビゲーションバーを半透明にしたい場合には、修正案が見つかりませんでした。 たとえば、写真をフルスクリーンで見る場合は、ナビゲーションバーを半透明にし、その下にフレームを表示することができます。 それはうまくいきますが、ナビゲーションバーの表示/非表示を切り替えると、私はさらに奇妙な結果を経験しました。 最初のサブビュー(UIScrollView)は、毎回その原点とその境界を取得します。


edgesForExtendedLayoutはiOS 7のトリックです。ただし、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

迅速な解決策:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}

あなたはどれだけ下にシフトするかを計算する必要はありません。これにはプロパティが組み込まれています。 Interface Builderで、View Controllerを強調表示し、属性インスペクタに移動します。 ここでは、「辺を伸ばす」の横にあるチェックボックスが表示されます。 表示されているように、最初のスクリーンショットでは、デフォルトの選択はコンテンツが上部バーと下部バーの下に表示されますが、不透明バーの下には表示されません。

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

この2番目のスクリーンショットは、「アンダートップバー」チェックボックスの選択を解除するとどうなるかを示しています。 ご覧のように、View Controller Viewは、y原点がナビゲーションバーのすぐ下にくるように適切に下にシフトされています。

これは、 -[UIViewController edgesForExtendedLayout]使い方を使ってプログラム的に行うこともできます。 ここには、 edgeForExtendedLayout 、およびedgeForExtendedLayoutのクラスリファレンスへのリンクがありUIRectEdge

[self setEdgesForExtendedLayout:UIRectEdgeNone];

私の場合、loadView()が中断している
このコード:self.edgesForExtendedLayout = UIRectEdgeNone

しかし、loadView()を削除した後は、すべて正常に動作しました


表示される次のコードが設定されます。

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }

スウィフト3

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}

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


私はStunnerの答えを拡張し、 if文を追加してiOS-7であるかどうかを確認したいと思います。これは、iOS 6でテストしたときにアプリがクラッシュするためです。

追加は次のようになります:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

だから私はあなたのMyViewControler.mファイルにこのメソッドを追加することをおMyViewControler.mます:

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}

ドロップダウンinfo.plistのキー "View Controller-based status bar appearance"をinfo.plist行として追加しinfo.plist 。 このようなもの:


私は別のUIViewControllerを提示するだけで、iPads(armv7、armv7s、amr64)が私のアプリで同じ問題を抱えていましたが、ステータスバーの下にナビゲーションバーが表示された後に...私はそのための解決策を見つけるのに多くの時間を費やします。 私はストーリーボードとUIViewControllerのInterfaceBuilderを使用していますが、これはFullScreen - > Current Contextからプレゼンテーションを設定してこの問題を解決します。 私のアプリでは、iPads => iOS8.0(iOS8.1でテスト)とiOS 7.1で動作するiPadsのみで動作します!


私にとって、最も簡単な解決策は、plistに2つのキーを追加することです


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

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

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

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

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

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

iOS 7では、 wantsFullScreenLayoutビューコントローラのプロパティは推奨されていません。現在、 wantsFullScreenLayout = NO指定している場合、View Controllerは、iOS 7で動作しているときに予期しない画面位置にコンテンツを表示することがあります。

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

  • edgesForExtendedLayout

edgesForExtendedLayoutプロパティは、noneとallを指定するだけでなく、四角形のUIRectEdgeそれぞれを指定するUIRectEdge型を使用します。 edgesForExtendedLayoutを使用して、バーの半透明にかかわらず、ビューのどの辺をedgesForExtendedLayoutするかを指定します。 デフォルトでは、このプロパティの値はUIRectEdgeAllです。

  • extendedLayoutIncludesOpaqueBars

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

  • automaticallyAdjustsScrollViewInsets

スクロールビューのコンテンツインセットが自動的に調整されないようにするには、 automaticallyAdjustsScrollViewInsetsNOに設定しautomaticallyAdjustsScrollViewInsets 。 ( automaticallyAdjustsScrollViewInsetsのデフォルト値はYESです)。

  • topLayoutGuide、bottomLayoutGuide

bottomLayoutGuideプロパティとbottomLayoutGuideプロパティは、View Controllerのビュー内の上部または下部のbottomLayoutGuideの位置を示します。 バーをビューの上部または下部に重ねる必要がある場合は、Interface Builderを使用して、 topLayoutGuideの下部またはtopLayoutGuideの上部に制約を作成して、ビューをバーに対して相対的に配置できます。 (ビューが重なっていない場合、 topLayoutGuideの一番下はビューの一番上と同じで、 bottomLayoutGuideの一番上はビューの一番下になります)。

参照してください、 apple doc


私は、AppleがBannerViewControllerに埋め込まれた広告とScrollViewControllerを表示するためにBannerViewControllerを使用するシナリオを持っています。

ナビゲーションバーがコンテンツを隠すのを防ぐために、私は2つの変更を加えなければなりませんでした。

1)BannerViewController.mを変更します。

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2)私のScrollViewContollerを変更する

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

これで、ナビゲーションバーで覆われるのではなく、ビューの下部に広告が正しく表示され、上部のコンテンツが途切れることはありません。


このようにトップレイアウトに制約を加える


Swift 4.2 - Xcode 10.0 - iOS 12.0:

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}




ios7