web-dev-qa-db-ja.com

IOS7のUINavigationBar / Status Barの問題

最終編集

(明確にするために最終編集を行う編集に関する過度に長い質問があるのではなく、必要に応じて他の編集を参照してください)。

コントローラーのセットアップ

次のようにセットアップされたアプリケーションがあります。

InitialViewController(サブクラス ECSlidingViewController

メインナビゲーションコントローラー(UINavigationControllerのサブクラス)

メインHome View Controller(UIViewControllerのサブクラス)


InitialViewControllerのviewDidLoadで、Home View ControllerをルートとしてメインNavigation Controllerをロードします。

self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];

問題

アプリケーションの最初のロードでは、ステータスバーとナビゲーションバーが分離されます。 enter image description here

これは望ましい効果です。

ただし、標準の方法を使用して、モーダルビューコントローラーを読み込んで閉じます。

[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];

次に、閉じます:

[self dismissViewControllerAnimated:YES completion:nil];

これにより、メインナビゲーションコントローラー(ホームビューコントローラーを保持)がステータスバーを誤って重複して表示します。

enter image description here

テスト中

  1. Plist設定はYES-View controller-based status bar appearanceに設定されています
  2. edgesForExtendedLayoutを関連するnoneに設定しようとしましたが、変更はしませんでした。

ロギング

問題が発生した場所を確認するために、いくつかのフレームをログアウトしようとしました。

最初のロード時:

メインナビゲーションVC-ビューフレーム-{{0、0}、{320、480}}

Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}}

Initial VC - View Frame - {{0, 0}, {320, 480}}

Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

--- After Modal is opened/closed ----

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav

Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav

Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
47
StuartM

Apple「ビューを覆うことからステータスバーを防ぐ」ことに関する推奨事項:) https://developer.Apple.com/library/content/qa/qa1797/_index。 html

そして、「UIBarPositioningDelegate」をご覧になりましたか? https://developer.Apple.com/documentation/uikit/uibarpositioningdelegate

39
Nicolas Buquet

IOS 7.0では、UIViewControllerはデフォルトでこのように機能します。 UINavigationController内でUIViewControllerを使用しており、navigationBarが表示されている場合、ビューはフルスクリーンになります。

NavigationBarが表示されている場合、以下を実行します。 ==>

self.edgesForExtendedLayout = UIRectEdgeNone

navigationBarが非表示の場合は、次を実行します。 ==>

20ポイントをシフトして、すべてのUIView要素を調整します

Interface Builderを使用する場合、iOS6/7デルタを使用できます。最初に「iOS 6.0として表示」、次に「20」のデルタを設定して、iOS 7で+20オフセットを実現します

26
Sunil Adhyaru

まだ誰も正しい答えを出していないことに驚いています。 UIBarPositioningDelegateは魅力のように機能します! View ControllerをUIBarPositioningDelegateにし、それをバーのデリゲートとして割り当てます。ビューの上部から20ピクセルの位置にバーを配置します。次に、View Controllerにこのメソッドを追加します(iOS7 +でのみ使用可能):

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar 
{ 
   return UIBarPositionTopAttached; 
}
18
jbcaveman

メインビューコントローラーをスライドさせる「ハンバーガー」メニューボタンで同様の問題があり、横にメニュービューコントローラーがありました。メニュービューコントローラーのナビゲーションバーは、ステータスバーが表示されているかどうかを認識していません。ステータスバーが表示されて隠れたときに通知を投稿して修正しました

[self.navigationController setNavigationBarHidden:YES/NO animated:NO];

メニューのView Controllerで。

4
Stephen Johnson

この投稿からの回答を使用してこのような問題を修正しました: iOS 7 |ナビゲーションバー/ステータスバーに非常に近いツールバーボタン

自動レイアウトを使用すると、新しいフレームの設定を無視する必要があります。 iOS 7のTopBarには、20に等しいTop Space Constraintを追加する必要があります。

3
grigorievs

viewDidLoadメソッドに次のコードを追加しようとしましたか?

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

AppleiOS 7への移行で簡単に説明されています doumentation。

3
Nicolas Buquet

私はこの問題に長々と答えました 同様の質問に対するこの答えで 。簡単な答えは次のとおりです。iOS6以前では、慣れている自動ステータスバーレイアウト動作を取得する方法はありません。それを中心に設計するか、古いスタイルをシミュレートする方法を見つける必要があります(両方のアプローチについて説明します)。

ナビゲーションバーフレームを手動で調整することを強くお勧めしますnot。 UINavigationControllerにそれを自分で処理させます。おそらく、あなたの問題は、Navigation ControllerのビューのフレームがUIScreenの境界と等しくないことです。

1
jaredsinclair

ViewControllerがメインVCであることを知っています。しかし、誰かがUITableviewControllerを使用していて、同じ問題がある場合、このコードは問題を解決します。

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
1
macL0vin

はい、同じ問題がありました。すべてのステップに従いましたが、変更はありませんでした。

で指定されたトップビュー/ツールバーだけでなく、画面全体に対してAutoLayoutが正しく設定されていることを確認することで動作するようになりました

「ステータスバーがビューをカバーしないようにする」: https://developer.Apple.com/library/ios/qa/qa1797/_index.html

少なくともメインのViewcontroller.viewのすぐ下のすべてのビューについて。

0
brian.clear

私にとっての解決策は、ナビゲーションバーを20ポイントにシフトすることでした enter image description here

0
dip

これに対する解決策は実際には非常に簡単です。 UINavigationBarのcenter.y値。UIKitがUINavigationBarをステータスバーの高さに調整するためにネイティブに使用する値です。簡単にするために、UINavigationBarをサブクラス化し、次のことを行いました。

@implementation MyNavigationBar

    - (void) setCenter:(CGPoint)center {
        // Anything less than or equal to 22 is something we don't want (below SB height)
        if(center.y > 22) [super setCenter:center];
    }

@end
0
mattsven

これを行う組み込みの方法があります。 Joel Caveの答えと同じですが、詳しく説明します。

ナビゲーションバーのY原点を20ポイントにします。

次に、.hファイルで:

@interface XYZViewController : UIViewController <UIBarPositioningDelegate>

そして.mファイルで:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationBar.delegate = self;
}

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { 
    return UIBarPositionTopAttached; 
}
0
Jeffrey Sun