iOS7 - ステータスバーの下の表示 - edgesForExtendedLayout が機能しない 質問する

iOS7 - ステータスバーの下の表示 - edgesForExtendedLayout が機能しない 質問する

昨年構築したプロジェクトがあり、ストーリーボードではなく XIB を使用しています。XIB は自動レイアウトを使用しませんが、自動サイズ設定は多少使用します。iOS7 で実行すると、すべてのビューがステータス バーの下に隠れてしまうという問題が発生します。これは iOS7 の新機能であり、想定内であることは十分理解しています。ただし、これを修正して回避するためのすべての解決策が機能していません。ビューの上部に、常にステータス バーの下に表示される画像があり、ナビゲーション バーなどは使用していません。

XIB の Y デルタを更新しようとしましたが (ビューには影響しません)、 を に設定しようとしましたが (何も起こりません)、その他にもさまざまなことを試しましたedgesForExtendedLayoutUIRectEdgeNone毎回、何をしてもステータス バーの下にビューが隠れた状態で表示されます。つまり、XIB でビューを手動で下に移動してステータス バー用のスペースを確保しない限りは (ただし、この解決策は iOS6 では正しく表示されないため機能しません)、何をしてもステータス バーの下にビューが隠れた状態で表示されます。

奇妙なのは、ビューシフトをハックするコード行を試しても、機能しないことです (次のように)。

self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+20, self.view.frame.size.width, self.view.frame.size.height);

私がそのような解決策を採用するわけではありませんが、それが機能しないのは奇妙です (通常、それが機能しないのは自動レイアウトが設定されている場合のみですが、この場合はそうではありません)。

ステータス バーが表示されるのは設計上の要件ですが、iOS7 のステータス バーの下にビューを設定できない理由がわかりません。この件に関する Stack Overflow の投稿や、Apple の移行ガイドをすべて読みました。もう一度繰り返しますが、どのように機能するべきか、また、この問題に対する期待される解決策は何かを十分に理解していますが、この特定のプロジェクトではどれもうまく機能していないようです。

私は経験豊富な iOS 開発者ですが、このプロジェクトは別のチームによって構築されたため、XIB ファイル、plist、またはコードのどこかに上記の設定よりも優先される何かが隠されているかどうかはわかりません。これについて他に確認できる点や、私が提供できる詳細情報がある場合はお知らせください。

前もって感謝します!

ベストアンサー1

Interface Builder で iOS 6/7 のデルタ値を設定する場合は、Interface Builder ドキュメントで「表示形式」を「iOS 6」に設定することを忘れないでください。これは、複製したいレイアウトが iOS 6 であるためです。デルタは、コンテンツをステータス バーの下にプッシュするために iOS 7 でのみ使用されます。「表示形式」を iOS 7 (デフォルト) に設定したままにすると、デルタは iOS 6 で iOS 7 の外観になります。

ただし、ビュー フレームに基づいてプログラムでビューの位置を変更したり、ビューのサイズを変更したりする場合、フレームはデルタを考慮しないため、デルタは役に立ちません。

デルタを使用する代わりに、メイン XIB で自動レイアウトを有効にし、トップ/コンテンツ ビューの上部スペース制約をトップ レイアウト ガイドに従うように設定するのが、私が見つけた最善の解決策です。このガイドは iOS 7 で導入され、ステータス バーの下の位置を表します。残念ながら、ストーリーボードを使用していない場合、このガイドは Interface Builder では使用できませんが、プログラムで追加できます。

私が行ったのは、Interface Builder でスーパービューに上部のスペース制約を追加し、コード内にそのためのアウトレットを作成することでした。次に、viewDidLoad で、topLayoutGuide が使用可能な場合 (iOS 7 以降)、このアウトレットの制約を、代わりに Top Layout Guide を使用するバージョンに置き換えます。

if ([self respondsToSelector:@selector(topLayoutGuide)]) {
    [self.view removeConstraint:self.containerTopSpaceConstraint];

    self.containerTopSpaceConstraint =
    [NSLayoutConstraint constraintWithItem:self.contentView
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.topLayoutGuide
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1
                                  constant:0];

    [self.view addConstraint:self.containerTopSpaceConstraint];

    [self.view setNeedsUpdateConstraints];
    [self.view layoutIfNeeded];
}

おすすめ記事