web-dev-qa-db-ja.com

iOS 7:モーダルビューコントローラーのステータスバーの色が間違っているが、通常のビューコントローラーは正しい

IOS7で、通常のUINavigationControllerプッシュビューコントローラーのステータスバーテキストの色がUINavigationControllerナビゲーションバーの色(薄い灰色で、ほとんど白いのでステータスバーのテキストが黒)になっているという問題があります。ただし、「モーダル」ビューコントローラーが-presentViewController:animated:completion:、ステータスバーのテキストの色が白に変更され、ナビゲーションバーの色を考えると非常にわかりにくい。ナビゲーションバーの色はアプリ全体で常に同じで、ビューコントローラごとに変化しません。これはすべての-presentViewController呼び出し。

「コントローラーベースのステータスバーの外観を表示する」はYESに設定されています。

これを試して解決するために何を見ればよいのかわかりません。

21
chadbag

yourModalViewControler.modalPresentationCapturesStatusBarAppearanceをYESに設定し、「View Controller-based Status Bar Appearance」をYESのままにします。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.modalPresentationCapturesStatusBarAppearance = YES;
    ....
}

次に、preferredStatusBarStyleを上書きします

- (UIStatusBarStyle)preferredStatusBarStyle {
    return TheStyleYouWant;
}
14
chie

ナビゲーションコントローラーは、ナビゲーションバーの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];
14

私はその方法を理解したところです。私はまったく同じ問題を抱えていましたが、それは魅力のように機能しているようです!

最初にする必要があるのは、プロジェクトの.plistファイルの属性をNOに変更することです。属性は、「コントローラーベースのステータスバーの外観を表示する」です。属性が存在しない場合は、私が書いたとおりに(引用符なしで)正確に新しい属性を追加してください。

2つ目は、各ビューコントローラーのviewDidLoadメソッドに追加することです。

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

ステータスバーのテキストを白にしたい場合、または

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

ステータスバーのテキストを黒にしたい場合。

それで全部です!

2
Tzegenos

UIViewControllerBasedStatusBarAppearanceNOに設定しますinfo.plist

2
Frane Poljak

これは機能します。しかし、少しハックなので、私はそれに満足していません。モーダルビューで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];
}
2
meaning-matters

ナビゲーションコントローラクラスで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];

}
2
user2163433

私はあなたと同じ問題を抱えていました。 info.plistは正しく、他のすべての場所ではpreferredStatusBarStyleが正しく呼び出されました。しかし、私のモーダルビューではありません。これは、preferredStatusBarStyleがナビゲーションコントローラに送信されたためです。だから私はそれが提示していたビューコントローラにpreferredStatusBarStyleを渡すUINavigationControllerのサブクラスを作成しました、そして実際には、すべてが再び必要なように動作していました

1
niklassaers

ここで提供されたすべての回答と他の回答を確認したところ、私が機能した唯一の解決策は、モーダルで提示しているビューコントローラーに対して空のナビゲーションバーを作成するであることがわかりました。

これはあなたにはうまくいかないかもしれませんが、私には次の理由でうまくいきます:

  1. とにかく、モーダルダイアログにはナビゲーションバーがあります(ナビゲーションには使用されませんが、結果を保存または閉じるために使用されます)。
  2. ステータスバーの色は、上記で説明したように、applicationDidFinishLaunchingでアプリケーション全体ですでに定義されており、カスタム色を持っています。

エンジニアリングの観点からは、効果的に何もしないナビゲーションコントローラーがあるのはやや煩わしいですが、ナビゲーションコントローラーがないと、この問題を回避できませんでした。

0
dave

私の解決策:

newViewController.modalPresentationStyle = .fullScreen

デフォルトでは、UINavigationControllerがステータスバーのスタイルを決定し、すべてのサブビューコントローラーのスタイルをオーバーライドします。ただし、モーダルビューコントローラーがフルスクリーンの場合、そのメソッドpreferredStatusBarStyleが呼び出されます。

0
rjobidon