web-dev-qa-db-ja.com

ナビゲーションバー付きのモーダルビューでiOS7のUIStatusBarStyleを変更するにはどうすればよいですか?

iOS 7移行ガイドUIStatusBarStyleUIViewControllerを動的に変更する方法についての良いヒントを

_- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleDefault;
}
_

_[self setNeedsStatusBarAppearanceUpdate];_と一緒に

これは、シングルビューアプリケーションで正常に機能します。ただし、現在、モーダルビューのUIStatusBarStyleUIStatusBarStyleLightContentに変更しようとしています。 MainViewControllerに続くModalViewControllerがあり、それ自体はNavigationControllerに埋め込まれています。 ModalViewControllerはデリゲートをMainViewControllerに設定しました。

ModalViewControllerの_[self setNeedsStatusBarAppearanceUpdate];_を、そのクラスの次のメソッドと一緒に呼び出しようとしましたが、効果はありませんでした。

_// In ModalViewController.m
- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}
_

また、モーダルビューが表示されたときにMainViewControllerを返すために- (UIStatusBarStyle)preferredStatusBarStyle {}の条件で_[self setNeedsStatusBarAppearanceUpdate];_メソッドのUIStatusBarStyleLightContentで_prepareForSegue: sender:_を呼び出そうとしましたが、それも効果はありません。

モーダルビューでUIStatusBarStyleを変更するにはどうすればよいですか?

編集:投稿の更新:ModalViewControllerNavigationControllerNavigationBarNavigationBarをhiddenに設定すると、ModalViewControllerでの_[self setNeedsStatusBarAppearanceUpdate];_の呼び出しは正常に機能します。ただし、バーが表示されているときは違います。

11
FrankZp

適切なステータスバー情報を返すには、フルスクリーンで表示されているViewControllerが必要です。あなたの場合:ModalViewControllerを含むNavigationControllerは、preferredStatusBarStyleを実装し、UIStatusBarStyleLightContentを返す必要があります。

setNeedsStatusBarAppearanceUpdateの呼び出しは、ViewControllerが返す値が実際に変更された場合にのみ必要です。ビューコントローラが最初に提示されたとき、とにかくそれらは照会されます。

28
jaetzold

フルスクリーン以外のmodalVC[〜#〜] can [〜#〜]modalPresentationCapturesStatusBarAppearanceを使用してstatusBarスタイルを制御できることに注意してください。

ステータスバーコントロールについてもっと知りたい人は、 ステータスバーを管理するUIViewController を無視しないでください。

2015-11-06に更新:

そして、 iOS Keys で説明されているUIViewControllerBasedStatusBarAppearanceを設定していることを確認してください

2018.04.09に更新:

NavControllerのviewControllerがiOS10.0-10.2でprefersStatusBarHiddenを呼び出さない可能性があることに気づきました。あなたのnavigationControllerをカスタマイズして

@implementation YourCustomNavController
//for iOS 10.0 - iOS 10.2
- (BOOL)prefersStatusBarHidden {
    UIViewController *childVC = [self childViewControllerForStatusBarHidden];
    if (childVC) {
        return [childVC prefersStatusBarHidden];
    }
    return [super prefersStatusBarHidden];
}
@end

そして、もっと深く入りたい人は誰でもUIKitを掘り下げることができます+[UIViewController _currentStatusBarStyleViewController]HopperまたはIDAProを使用します。それはあなたがこれらの種類のバグを解決するのを助けるかもしれません。

24
Puttin

これを機能させるための鍵は、フルスクリーンのViewControllerだけがステータスバーのスタイルを決定できることです。

ナビゲーションコントローラーを使用していて、ビューコントローラーごとにステータスバーを制御する場合は、UINavigationControllerをサブクラス化し、topViewControllerの設定を返すようにpreferredStatusBarStyleを実装する必要があります。

ストーリーボードシーンのクラス参照をUINavigationControllerからサブクラスに変更してください(例:以下の例のMyNavigationController)。

(以下は私にとってはうまくいきます。アプリがTabBarベースの場合、UITabBarControllerをサブクラス化することで同様のことをしたいと思うでしょうが、私はそれを試していません)。

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return self.topViewController.preferredStatusBarStyle;
}

@end
11
Juddster

UINavigationControllerをサブクラス化せずにViewControllerを埋め込んだUINavigationControllerのステータスバーを変更するには、次を使用します。

navigationController?.navigationBar.barStyle = .Black // to make the status bar text white

.Blackはテキストを白(ステータスバーとビューのタイトル)にしますが、.Defaultは黒のタイトルとステータスバーを持ちます。

6
Alex Wally

サイドメニュー/リビールコントローラー(SWRevealController)があり、ステータスバークエリのルートコントローラーであることがわかりました。 childViewControllerForStatusBarStyleをオーバーライドすると、クエリを最前面のコントローラーに再ルーティングできます。

/**
 This view is always considered the topmost for status bar color queries.
 Pass the query along to what we're showing in front.
 */
- (UIViewController *)childViewControllerForStatusBarStyle
{
    UIViewController *front = self.frontViewController;
    if ([front isKindOfClass:[UINavigationController class]])
        return ((UINavigationController*)front).topViewController;
    else
        return front;
}
2
Graham Perks

これは私のために働きます:

  1. View controller-based status bar appearanceNOに設定します
  2. ステータスバーのスタイルをUIStatusBarStyleLightContentに設定します(その値をコピーするだけです)
  3. AppDelegateで[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];を使用します

お役に立てば幸いです(参照: モーダルビューでios7ステータスバーが黒に戻りますか?

1
samthui7

アプリが最上位のviewControllerのstatusBarStyleから外れているようです。したがって、現在のviewControllerの上に別のviewControllerを追加すると、新しいviewControllerからキューを取得するようになります。

1

アプリのrootViewControllerが-(UIStatusBarStyle)preferredStatusBarStyleメソッドをオーバーライドする必要があるかどうかを調べるだけです

0
devClown

上記のすべての作業。ただし、ストーリーボードなどのすべてのインスタンスを変更するのは本当に苦痛な場合があります。したがって、サブクラス化も含む、私にとって有効なものがあります。

最初にサブクラスを作成します。

@interface HHNavLightColorBarController : UINavigationController

@end

@implementation HHNavLightColorBarController

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}
@end

次に、Objective-Cの魔法と<objc /runtime.h>を少し使用します。

ビューコントローラのリファレンスとそれを提示する場合:

UINavigationController *navVC = ...; // Init in your usual way
object_setClass(navVC, [HHNavLightColorBarController class]);
[self presentViewController:nav animated:YES completion:^{
    NSLog(@"Launch Modal View Controller");
}];

時々それは少し邪魔にならないようです。あなたのkindOfClassがナビゲーションコントローラーであるかどうかをチェックするカテゴリーを作成し、それを自動的に行うこともできます。とにかく、答えはjaetzoldによるものです、私はこれが便利だと思っただけです。

0
bainfu