(明確にするために最終編集を行う編集に関する過度に長い質問があるのではなく、必要に応じて他の編集を参照してください)。
次のようにセットアップされたアプリケーションがあります。
InitialViewController(サブクラス ECSlidingViewController )
メインナビゲーションコントローラー(UINavigationController
のサブクラス)
メインHome View Controller(UIViewController
のサブクラス)
InitialViewControllerのviewDidLoad
で、Home View ControllerをルートとしてメインNavigation Controllerをロードします。
self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];
アプリケーションの最初のロードでは、ステータスバーとナビゲーションバーが分離されます。
これは望ましい効果です。
ただし、標準の方法を使用して、モーダルビューコントローラーを読み込んで閉じます。
[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
次に、閉じます:
[self dismissViewControllerAnimated:YES completion:nil];
これにより、メインナビゲーションコントローラー(ホームビューコントローラーを保持)がステータスバーを誤って重複して表示します。
View controller-based status bar appearance
に設定されています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
Apple「ビューを覆うことからステータスバーを防ぐ」ことに関する推奨事項:) https://developer.Apple.com/library/content/qa/qa1797/_index。 html
そして、「UIBarPositioningDelegate」をご覧になりましたか? https://developer.Apple.com/documentation/uikit/uibarpositioningdelegate
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オフセットを実現します
まだ誰も正しい答えを出していないことに驚いています。 UIBarPositioningDelegateは魅力のように機能します! View ControllerをUIBarPositioningDelegateにし、それをバーのデリゲートとして割り当てます。ビューの上部から20ピクセルの位置にバーを配置します。次に、View Controllerにこのメソッドを追加します(iOS7 +でのみ使用可能):
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
メインビューコントローラーをスライドさせる「ハンバーガー」メニューボタンで同様の問題があり、横にメニュービューコントローラーがありました。メニュービューコントローラーのナビゲーションバーは、ステータスバーが表示されているかどうかを認識していません。ステータスバーが表示されて隠れたときに通知を投稿して修正しました
[self.navigationController setNavigationBarHidden:YES/NO animated:NO];
メニューのView Controllerで。
この投稿からの回答を使用してこのような問題を修正しました: iOS 7 |ナビゲーションバー/ステータスバーに非常に近いツールバーボタン
自動レイアウトを使用すると、新しいフレームの設定を無視する必要があります。 iOS 7のTopBarには、20に等しいTop Space Constraintを追加する必要があります。
viewDidLoad
メソッドに次のコードを追加しようとしましたか?
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
AppleiOS 7への移行で簡単に説明されています doumentation。
私はこの問題に長々と答えました 同様の質問に対するこの答えで 。簡単な答えは次のとおりです。iOS6以前では、慣れている自動ステータスバーレイアウト動作を取得する方法はありません。それを中心に設計するか、古いスタイルをシミュレートする方法を見つける必要があります(両方のアプローチについて説明します)。
ナビゲーションバーフレームを手動で調整することを強くお勧めしますnot。 UINavigationControllerにそれを自分で処理させます。おそらく、あなたの問題は、Navigation ControllerのビューのフレームがUIScreenの境界と等しくないことです。
ViewControllerがメインVCであることを知っています。しかし、誰かがUITableviewControllerを使用していて、同じ問題がある場合、このコードは問題を解決します。
self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
はい、同じ問題がありました。すべてのステップに従いましたが、変更はありませんでした。
で指定されたトップビュー/ツールバーだけでなく、画面全体に対してAutoLayoutが正しく設定されていることを確認することで動作するようになりました
「ステータスバーがビューをカバーしないようにする」: https://developer.Apple.com/library/ios/qa/qa1797/_index.html
少なくともメインのViewcontroller.viewのすぐ下のすべてのビューについて。
これに対する解決策は実際には非常に簡単です。 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
これを行う組み込みの方法があります。 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;
}