ios - supported - iphone version




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

Swift 4.2 - Xcode 10.0 - iOS 12.0:

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

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

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

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

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

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

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

更新:

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

self.navigationController.navigationBar.translucent = NO;

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

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


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

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

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

スウィフト3

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

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

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

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

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

[self setEdgesForExtendedLayout:UIRectEdgeNone];

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


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


ビューに半透明のナビゲーションバー(これは一種)が必要な場合は、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);
}

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


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

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


私は、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;
    }
}

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


私はプログラム的に私のビューを作成し、これは私のために働いて終わった:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Source39ページ下のtopLayoutGuideセクション)。


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

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

迅速な解決策:

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




ios7