IOS7で、通常のUINavigationControllerプッシュビューコントローラーのステータスバーテキストの色がUINavigationControllerナビゲーションバーの色(薄い灰色で、ほとんど白いのでステータスバーのテキストが黒)になっているという問題があります。ただし、「モーダル」ビューコントローラーが-presentViewController:animated:completion:
、ステータスバーのテキストの色が白に変更され、ナビゲーションバーの色を考えると非常にわかりにくい。ナビゲーションバーの色はアプリ全体で常に同じで、ビューコントローラごとに変化しません。これはすべての-presentViewController
呼び出し。
「コントローラーベースのステータスバーの外観を表示する」はYESに設定されています。
これを試して解決するために何を見ればよいのかわかりません。
yourModalViewControler.modalPresentationCapturesStatusBarAppearanceをYESに設定し、「View Controller-based Status Bar Appearance」をYESのままにします。
- (void)viewDidLoad {
[super viewDidLoad];
self.modalPresentationCapturesStatusBarAppearance = YES;
....
}
次に、preferredStatusBarStyleを上書きします
- (UIStatusBarStyle)preferredStatusBarStyle {
return TheStyleYouWant;
}
ナビゲーションコントローラーは、ナビゲーションバーのbarStyle
プロパティに基づいて、コンテンツを明るいか暗いかを決定します。デフォルトのUIBarStyleDefault
は、ナビゲーションバーの色が薄く、ステータスバーのコンテンツが暗いことを意味します。このプロパティをUIBarStyleBlack
に変更しても、実際にはナビゲーションバーが黒くなるわけではありません(ナビゲーションバーの色はbarTintColor
を使用して設定されています)が、暗い色であることを示しています。次に、ナビゲーションコントローラーは、ナビゲーションバーが暗いので、ステータスバーの内容を明るくする必要があると判断します。
(ナビゲーションをプッシュする)メインのナビゲーションコントローラーでは、barStyle
が実際にUIBarStyleBlack
に設定されているようです。次のように、モーダル表示されたナビゲーションコントローラに対して同じことを行う必要があります。
UINavigationController *newViewController = [[UINavigationController alloc] initWithRootViewController:modalViewController];
newViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;
[self presentViewController:newViewController animated:YES completion:nil];
私はその方法を理解したところです。私はまったく同じ問題を抱えていましたが、それは魅力のように機能しているようです!
最初にする必要があるのは、プロジェクトの.plistファイルの属性をNOに変更することです。属性は、「コントローラーベースのステータスバーの外観を表示する」です。属性が存在しない場合は、私が書いたとおりに(引用符なしで)正確に新しい属性を追加してください。
2つ目は、各ビューコントローラーのviewDidLoadメソッドに追加することです。
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
ステータスバーのテキストを白にしたい場合、または
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
ステータスバーのテキストを黒にしたい場合。
それで全部です!
UIViewControllerBasedStatusBarAppearance
をNO
に設定しますinfo.plist
これは機能します。しかし、少しハックなので、私はそれに満足していません。モーダルビューでpreferredStatusBarStyle
が呼び出されないのはバグだと思います。アップルに尋ねます。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
[self setNeedsStatusBarAppearanceUpdate];
}
ナビゲーションコントローラクラスでpreferredStatusBarStyleメソッドを再定義できます
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
// or UIStatusBarStyleBlackOpaque, UIStatusBarStyleBlackTranslucent, or UIStatusBarStyleDefault
}
「view did load method」を定義して、必要なカスタム色を設定することもできます
- (void) viewDidLoad
{
UIColor *barColor = [UIColor whitecolor];
UIView *colorView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
colorView.opaque = NO;
colorView.alpha = .5f;
colorView.backgroundColor = barColor;
self.navigationBar.barTintColor = barColor;
self.navigationBar.tintColor = [UIColor whiteColor];
[self.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
/*self.navigationController.navigationBar.barTintColor = [UIColor blackColor];
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];
self.navigationController.navigationBar.translucent = NO;*/
[self.navigationBar.layer insertSublayer:colorView.layer atIndex:0];
}
私はあなたと同じ問題を抱えていました。 info.plistは正しく、他のすべての場所ではpreferredStatusBarStyleが正しく呼び出されました。しかし、私のモーダルビューではありません。これは、preferredStatusBarStyleがナビゲーションコントローラに送信されたためです。だから私はそれが提示していたビューコントローラにpreferredStatusBarStyleを渡すUINavigationControllerのサブクラスを作成しました、そして実際には、すべてが再び必要なように動作していました
ここで提供されたすべての回答と他の回答を確認したところ、私が機能した唯一の解決策は、モーダルで提示しているビューコントローラーに対して空のナビゲーションバーを作成するであることがわかりました。
これはあなたにはうまくいかないかもしれませんが、私には次の理由でうまくいきます:
applicationDidFinishLaunching
でアプリケーション全体ですでに定義されており、カスタム色を持っています。エンジニアリングの観点からは、効果的に何もしないナビゲーションコントローラーがあるのはやや煩わしいですが、ナビゲーションコントローラーがないと、この問題を回避できませんでした。
私の解決策:
newViewController.modalPresentationStyle = .fullScreen
デフォルトでは、UINavigationControllerがステータスバーのスタイルを決定し、すべてのサブビューコントローラーのスタイルをオーバーライドします。ただし、モーダルビューコントローラーがフルスクリーンの場合、そのメソッドpreferredStatusBarStyle
が呼び出されます。