UIStatusBarStyleがSwiftで機能しない


85

Swiftアプリのステータスバーの色を白に変更しようとしていますが、レンガの壁にぶつかっています。それぞれがNavigationControllerに埋め込まれている3つのViewControllerがあります(これが問題になる可能性がありますか?すでにNavigationControllerクラスにコードを配置しようとしました)。AppDelegateのdidFinishLaunchingWithOptionsで次のコードの両方を試しました。 .swiftファイルですが、どちらも機能しませんでした。

application.statusBarStyle = .LightContent

そして

UIApplication.sharedApplication().statusBarStyle = .LightContent

ドキュメントがそれについて言わなければならないのは、UIBarButtonStyleがIntであり、この列挙型スニペットを私に与えてくれたということだけです。

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

何が足りないのですか?

回答:


145

2つのオプションがあります。

ステータスバーのスタイルを手動で設定し続ける場合は、今行っていることを続けますが、次のキーを値NO。でinfo.plistファイルに追加する必要があります。

コントローラベースのステータスバーの外観を表示する

または、アプリケーションのstatusBarStyleを設定する代わりに、View Controllerベースのステータスバーの外観を引き続き使用するpreferredStatusBarStyle場合は、ステータスバーのスタイルを指定する各ViewControllerのプロパティを上書きします。

スウィフト3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

スウィフト2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

このコードを試しましたが、最初の画面に白いステータスバーしか表示されません。残りの画面のステータスバーが表示されません:( ..何か助けがありますか?
Rahul 2015

7
plistの「コントローラーベースのステータスバーの外観を表示する」設定を「はい」に設定する必要があります。
stackUnderflow 2015年

1
それはあなたがいる場合にのみだたいビューコントローラベースのステータスバーの外観を使用します。
サムホームズ

4
iOS 10(Swift 3.0)では、メソッドではなくプロパティになりました。参照:stackoverflow.com/questions/38862208/...
stevo.mit

1つの画面だけ
Oubaida AlQuraan 2017

143

Swift 3.0

AppDelegate.swiftでdidFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

スイフト2.2

AppDelegate.swiftでdidFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

1
これは完璧な答えです:)
Jay Mayu

1
完璧な答え。短くて甘い。
mehul 2016年

3
申し訳ありませんが、これは最も簡単な答えかもしれませんが、これは間違いなく最善ではありません。これは、この1つのスタイルをアプリ内のすべてのviewControllerに設定するだけだからです。この動作は、より細かい制御を可能にし、さまざまなビューコントローラーに基づいてさまざまな設定を適用するために導入されました(たとえば、明るいコンテンツと暗いコンテンツの混合)。
auco 2016年

それは奇妙なことです-Appleのドキュメントが言っていることではありませんが、それは機能します。UIViewControllerベースのステータスバーを含む他の多くの方法を試しましたが、どれも機能しませんでした。
n13

33

以下を設定する必要があります。

navigationController.navigationBar.barStyle = .black

テキストは白で表示されます


1
ありがとう!)何もpreferredStatusBarStyle(FUNCも、このオーバーライドを助けたんだった- > UIStatusBarStyle {UIStatusBarStyle.LightContentを返す}これは本当に役立ちます:navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent =真
スヴィトラナ

感謝!あなたは私の日を救った。ただし、BlackTranslucentは非推奨です。したがって、navigationController.navigationBar.barStyle = .Black
hsusmita

と完全に連携していoverride var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }ます。あなたはviewDidLoadうまく失敗するためにこの行を書く必要があります。View controller-based status bar appearance = YESこの解決策を維持するようにしてください。
bhavin_m 2017

ちょうどそれを試してみましたが、のInfo.plistファイルに次のように働いていた...やり過ぎのように思える:1.ステータスバーのスタイル- > UIStatusBarStyleLightContent 2.ビューコントローラベースのステータスバーの外観- > NO
raistlin

21

iOS9.xおよびXcode7の場合、これを中に入れるだけAppDelegate.swiftです:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

これにより、ステータスバーのスタイルが自動的に次のように変わります。 .Lightcontent、UINavigationController内のすべてのViewControllerの。

(また、View controller-based status bar appearanceInfo.plistから削除して、おそらく表示される警告も抑制します!)


ありがとうございました。iOS9には深刻なバグがあるようです。これが、最初のVCでステータスバーを白くする唯一の方法でした。私はすべてを試しました。レーダーを提出します。
1b0t 2015

PreferredStatusBarStyleはUIStatusBarStyleDefaultを返しますが、特定のビューコントローラーのlightcontentをdarkcontentに更新しません。self.navigationController.navigationBar.barStyle = UIBarStyleDefaultの後; viewWillAppearで私のために働いた。このコメントが他の人に役立つことを願っています。
Pandey_Laxman 2015年

Swift 3
brycejl 2017

16

Swift 3では、ステータスバーのスタイルがUIViewControllerの計算プロパティに変更され、次のようにオーバーライドできます。

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 

13

iOS 9では、次の(setStatusBarStyle)は非推奨になり、そのようにすると警告が表示されます。

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

すべてのstatusBarを1回のショットで変更する場合は、Info.plistに以下を追加してみてください。これにより、起動画面のステータスバーも白になります。上記のコードはそうではありませんが。

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

.plistアプローチは正しいですが、setStatusBarStyle()は必要ありません。'setStatusBarStyle(_:animated :)'はiOS9.0で非推奨になりました:Use- [UIViewController PreferredStatusBarStyle]
Bill Chan

@BillChanコメントありがとうございますが、回答ゲインをお読みください。'setStatusBarStyle'が非推奨になったことはすでに説明しました。1つまたは別のviewControllerを変更する場合は、preferredStatusBarStyleを使用する必要があります。plistアプローチは、すべてのviewControllerを1回のショットで変更したい人向けです。ここには正しいことも悪いこともありません。何を達成する必要があるかだけの問題です。
GuiSoySauce 2016

1
UIStatusBarStyle = UIStatusBarStyleLightContent(.plist内)は、白いステータスバーテキストでアプリを起動するのに役立ちました...ありがとう!!!
クリスアリンソン2017年

10

私にとって、上記のすべては私が追加するまで機能しませんでした:

self.navigationController?.navigationBar.barStyle = .black;

そう:

  1. セットUIViewControllerBasedStatusBarAppearanceYES.plist
  2. ではviewDidLoadコールself.setNeedsStatusBarAppearanceUpdate();
  3. オーバーライドpreferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. オーバーライドされたメソッドでは、ライトコンテンツのnavigationBar.barStyle最終的な 設定も行います。

    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    とするためにブラックコンテンツ利用既定

からのソース ここここ

これが機能しない場合は、UINavigationController extension:を追加してみてください。

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}

1
ナビゲーションバーのスタイルについてのコメントはありません...しかし、Swift 3、Xcode8では-これが私のために働いた唯一の解決策でした。
Despotovic 2016年

私が気付いた唯一の欠点は、これらすべてのステップで変更されるが、アニメーションがないことです
Lukasz'Severiaan 'Grela 2017年

6

奇妙なことに、Swift 3.1とXC8.2.1を使用していますが、上記のすべてが機能しませんでした。

私がしたことはただ

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

Plistも他のものもありません。HTH


Swift4.2でも動作します。
zeeshan

2

Swift 3.0では、ViewControllerベースのステータスバーの外観のためにViewControllerのゲッターをオーバーライドできます。

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

1

Info.plistを編集しないでください。これをViewController.swiftに追加します。

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

1

ステップ1.info.plistに追加します View controller-based status bar appearance -> NO

手順2.ステータスバーの色を変更する必要があるメソッドにコードを追加します。

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

コードのキーライン: setNeedsStatusBarAppearanceUpdate()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.