111

iOS 7 用の Xcode 5 でビルドされた iPhone アプリケーションでは、を設定UIViewControllerBasedStatusBarAppearance=YESしました。このコードには次のコードがあります。info.plistViewController

-(UIStatusBarStyle) preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

ただし、ステータス バーは黒の背景に対して黒のままです。

UIViewControllerBasedStatusBarAppearance=NOを設定することでアプリ全体でこれを変更できることはわかっていますがinfo.plist、実際には実行時viewControllerviewControllerベースでこれを変更する必要があります。

4

17 に答える 17

281

ViewController が navigationController 内にある場合、navigationController が statusBarStyle をnavigationBar.barStyle決定することがわかりました。

navigationBarbarStyleを に設定するUIBarStyleBlackTranslucentと、白いステータス バー テキスト (ie. UIStatusBarStyleLightContent)が表示されUIBarStyleDefault、黒いステータス バー テキスト (ie. UIStatusBarStyleDefault) が表示されます。

これは、ナビゲーション バーの色を .xml で完全に変更した場合でも適用されることに注意barTintColorしてください。

于 2013-10-14T16:49:37.517 に答える
87

OK、ここにトリックがあります。キー「View controller-based status bar」を追加し、値を No に設定する必要があります。

これは、このキーの意味に反するように見えますが、値を に設定した場合Noでも、ステータス バーの外観を変更したり、ビュー コントローラーに表示するかどうかを変更したりできます。したがって、「はい」のように動作しますが、「いいえ」に設定してください!

これで、ステータス バーを白または暗くすることができます。

于 2013-10-19T20:03:18.350 に答える
77

preferredStatusBarStyle()内部で作業するUINavigationControllerにはUITabBarController、次のコードを追加します。これにより、現在表示されているビュー コントローラーから優先ステータス バー スタイルが取得されます。

extension UITabBarController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return visibleViewController
    }
}

Swift 3の場合、これらはメソッドではなくプロパティです。

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

Swift 4.2プロパティの名前が変更されました。

extension UITabBarController {
   open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
   open override var childForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

使用法

class ViewController: UIViewController {

    // This will be called every time the ViewController appears
    // Works great for pushing & popping
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}
于 2016-06-10T12:36:11.453 に答える
33

私はこれに少し遅れているかもしれませんが、他の誰かが機能し、検証されたアプリ全体のソリューションを探している場合に備えて.

@mxcl は、これが起こっている理由を説明する上で正しいです。これを修正するには、UINavigationController の preferredSatusBarStyle() メソッドをオーバーライドする拡張機能 (または obj-c のカテゴリ) を作成するだけです。Swift での例を次に示します。

extension UINavigationController {
    public override func preferredStatusBarStyle() -> UIStatusBarStyle {
        if let rootViewController = self.viewControllers.first {
            return rootViewController.preferredStatusBarStyle()
        }
        return super.preferredStatusBarStyle()
    }
}

このコードは、最初のビュー コントローラー (ルート ビュー コントローラー) を抽出し、ラップを解除します (obj-c では、nil でないことを確認します)。アンラップが成功した場合 (nil でない場合)、rootViewControllers preferredStatusBarStyle を取得します。それ以外の場合は、デフォルトを返します。

これが必要な人に役立つことを願っています。

于 2015-06-11T03:39:23.840 に答える
21

受け入れられた回答の詳細を提供するには、アプリのデリゲートのdidFinishLaunchingWithOptions:メソッドに次の行を追加します。

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

次に、Info.plist に追加View controller-based status bar appearanceして に設定しNOます。

アプリ全体で同じステータスバーの色が必要な場合は、ナビゲーションコントローラーからではなく、そうする必要があると思います。必ずしも埋め込まれていない画面UINavigationController、または別の場所の別のUINavigationControllerサブクラスなどがある場合があります。

編集:コードを入力せずに行うこともできます:https://stackoverflow.com/a/18732865/855680

于 2013-12-06T04:21:55.417 に答える
10

viewDidLoad でこれを書くだけです

[self setNeedsStatusBarAppearanceUpdate];

それをするだけでうまくいく

これを試してもらえますか

Set UIViewControllerBasedStatusBarAppearance to NO.
Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

あなたの質問で私が見たもう1つのことは、あなたがこのような方法を書いたことです

 -(void)UIStatusBarStyle PreferredStatusBarStyle ()
        {
            return UIStatusBarStyle.LightContent;
        }

しかし、それはこのようにする必要があります

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 
于 2013-10-01T05:29:16.143 に答える
6

これが私がそれを解決した方法です。通常、navigationController または tabBarController は、ステータス バーの外観 (非表示、色など) を決定するものです。

そのため、ナビゲーション コントローラーをサブクラス化し、preferredStatusBarStyle をオーバーライドすることになりました。現在表示されている ViewContorller が StatusBarStyleHandler を実装している場合、スタイルとして使用する値を要求します。そうでない場合は、デフォルト値を返すだけです。

ステータス バーの外観の更新をトリガーする方法は、メソッドが返す内容に従って、再度setNeedsStatusBarAppearanceUpdateトリガーし、UI を更新するを呼び出すことです。preferredStatusBarStyle

public protocol StatusBarStyleHandler {
    var preferredStatusBarStyle: UIStatusBarStyle { get }
}

public class CustomNavigationCotnroller: UINavigationController {

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        if let statusBarHandler = visibleViewController as? StatusBarStyleHandler {
            return statusBarHandler.preferredStatusBarStyle
        }

        return .default
    }
}

次に使用法

public class SomeController: UIViewController, StatusBarStyleHandler {

    private var statusBarToggle = true

    // just a sample for toggling the status bar style each time method is called
    private func toggleStatusBarColor() {
        statusBarToggle = !statusBarToggle
        setNeedsStatusBarAppearanceUpdate()
    }

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarToggle ? .lightContent : .default
    }
}
于 2016-08-22T06:22:46.943 に答える
4

1) プロジェクト全体の 1 つの設定:

利用可能な場合UIViewControllerBasedStatusBarAppearanceは、info.plist からキーと値のペアを削除するか、削除NOせずに設定します。info.plist で利用できない場合は、何もしません。デフォルトはNOこのプロパティです。

以下のコードを AppDelegate.m に追加します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

2) 異なるビュー コントローラーの異なる設定:

UIViewControllerBasedStatusBarAppearanceキーと値のペアを info.plist に追加し、 に設定しますYES

View Controller が Navigation Controller に組み込まれていない場合。MyViewController としましょう。以下のコードを MyViewController.m ファイルに追加するだけです。View Controller が Navigation Controller に組み込まれている場合は、新しい Cocoa Touch Class を作成し、それを UINavigationController のサブクラスにします。MyNCとしましょう。右側のペインで、ストーリーボードの [Navigation Controller View] を選択します。Utilities -> Identity Inspector -> Custom Class -> Class に「MyNC」と入力します。ストーリーボード ビューを「MyNC」ココア タッチ クラスにリンクした後、以下のコードを MyNC.m に追加します。

- (BOOL)prefersStatusBarHidden {
    return NO;
}

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}
于 2015-11-05T11:40:01.260 に答える
1

を使用している場合は、子ビュー コントローラーを参照するようにNavigationControllerサブクラス化できます。NavigationController

// MyCustomNavigationController

- (NSUInteger)supportedInterfaceOrientations {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk shouldAutorotate];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk preferredStatusBarStyle];
}

- (UIViewController *)findChildVC {
    return self.viewControllers.firstObject;
}
于 2015-05-06T08:48:43.983 に答える
0

私が直面した特定のケースについてメモを追加したいだけです。アプリに別の UIWindow を用意して、チャットの顔を表示し、常にアプリ全体に浮かんでいました。これを行うと、上記の解決策がどれも機能しなくなりました。その理由はよくわかりません! 私が気付いたのは、新しい UIWindow の ViewController がその理由だったということだけです! ステータス バーのスタイルを変更したい場合は、新しい UIWindow のビュー コントローラーで変更する必要があります。

このメモは、同様の構造を持つ他の人に役立つかもしれません! したがって、基本的には、新しい UIWindow の ViewController で上記のソリューションを適用できます。

繰り返しますが、これは特定のケースです。

ありがとう

于 2018-10-12T15:19:30.353 に答える
-1

Swift 3 の場合、UIViewController で:

override var preferredStatusBarStyle : UIStatusBarStyle { return UIStatusBarStyle.lightContent }
于 2017-02-02T14:23:02.787 に答える