Swift 3でステータスバーのスタイルを設定する方法


186

Xcode 8.0ベータ4を使用しています。

以前のバージョンでは、UIViewControllerにはステータスバーのスタイルを設定するメソッドがあります

public func preferredStatusBarStyle() -> UIStatusBarStyle

ただし、Swift 3で「Get Only Only Varaiable」に変更されたことがわかりました。

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

UIViewControllerで使用するスタイルを提供するにはどうすればよいですか?


この変数preferredStatusBarStyleを試してください:UIStatusBarStyle = .lightContent
Anbu.Karthik

回答:


485

[更新] Xcode 10以降およびSwift 4.2以降

これはiOS 7以降で推奨される方法です

アプリケーションInfo.plistので、に設定View controller-based status bar appearanceYESます。

各View ControllerのオーバーライドpreferredStatusBarStyleApple docs)。例えば:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

preferredStatusBarStyleビューコントローラーの内部で変更された何か(たとえば、スクロール位置や表示された画像が暗いかどうか)に基づいて別の優先ステータスバースタイルを返す場合はsetNeedsStatusBarAppearanceUpdate()、その状態が変化したときにを呼び出す必要があります。

バージョン7より前のiOS、非推奨のメソッド

Appleはこれを非推奨にしたため、将来削除される予定です。上記の方法を使用すると、iOSの次のバージョンがリリースされたときに書き換える必要がなくなります。

アプリケーションでをサポートする場合はInfo.plist、に設定View controller-based status bar appearanceNOます。

ではappDelegate.swiftdidFinishLaunchingWithOptions機能、追加します。

UIApplication.shared.statusBarStyle = .lightContent

ナビゲーションコントローラー用

あなたはナビゲーションコントローラを使用すると、あなたは、各ビューコントローラの優先ステータスバーのスタイルを使用して設定したい場合View controller-based status bar appearanceYES、アプリケーションの中でinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

3
私のために働く。最初に新しい設定をInfo.plistに挿入するのを忘れていました。
falsecrypt 09/07/17

1
@LightMan uiapplication statusBarStyleは非推奨ではありません。これをiOS 11で使用すると、動作します。
Sushobhit 2017年

1
@Sushobhit setStatusBarStyleは、この回答で使用されているように、iOS 9で廃止されました。ただし、読み取り専用プロパティとしてUIApplication.statusBarStyleがまだあります。
LightMan、2017年

1
各ビューの色が原因で、プログラムで設定できるようにしたい場合があります。
Alejandro Cavazos

9
appDelegate.swiftの行を削除して、[ターゲット]-> [一般]-> [展開情報]-> [ステータスバーのスタイル]-> [ライト]
Robert Veringa

162

最新のアップデート(Xcode 10+ / Swift 4.2+)

この記事は、過去数年間存在していたさまざまなアプローチの背後にある論理を理解したいと考えている人にはそのまま残されています。一方、Xcode 10以降、Swift 4.2の 最初のアプローチは非推奨になり、サポートされなくなりました(つまり、使用しようとしても効果がありません)。Plist.infoフラグの背後にある推論とカスタマイズの慣行をよりよく理解するために、情報が参照されています。

重要な説明

ステータスバーの外観をカスタマイズする2つの方法を理解することは非常に重要です。それらは異なり、混合してはなりません。

最初のアプローチ–アプリ全体で1色(iOS7以降非推奨)

info.plistで、次の名前のキーを見つけるか作成します

View controller-based status bar appearance

そして、それをNOに設定します。

それは何ですか?これは基本的に、アプリケーションでステータスバーの外観が各View Controllerによって個別に定義されないという設定を確立します。これは理解することが非常に重要です。つまり、アプリ全体、すべての画面で同じ設定になります。2つの設定があります。default白の背景に黒のテキストである、またはlightContent黒の背景に白のテキストであるです。

これらのいずれかを設定するには(すべての画面で1つの設定):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent // .default
    return true
}

これにより、各View Controllerでこの設定を再確立する必要がなくなります。ただし、いつでもこのメソッドを使用して、自発的に外観を変更できます。

2番目のアプローチ–各ビューコントローラーの個別の色

これは逆です。機能させるには、info.plistに移動して設定します

View controller-based status bar appearance

YES

このように、UIViewController必要な各インスタンスにこの実装を挿入すると、新しいビューコントローラーが開いているときは常にステータスバーのスタイルが個別に設定されます。

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

最初と同じですが、ステータスバーのスタイルをダークまたはライトのいずれかに設定し、ビューコントローラごとに個別に設定します。

このプロパティは、2つのシナリオでUIKitによってフェッチされます。

  1. 画面初期化時、UI準備中です。
  2. setNeedsStatusBarAppearanceUpdate()コードを呼び出すと。

後者の場合、次のコードでステータスバーの外観を操作できます。

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

その後、を呼び出すたびにtoggleAppearance()、ステータスバーのスタイルの変更がトリガーされます。

3番目のアプローチ–ハック!

ステータスバーに直接アクセスできるハックがあります:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = UIColor.blue
    }
    
    return true
}

なぜハック?黒または白以外のステータスバーの色が必要な場合は、ドキュメントに記載されていないAPIを使用します。statusBarKVCを使用してオブジェクトを取得し、その背景色を設定します。この方法で取得するオブジェクトはです。これはUIStatusBar、プロパティから派生しUIView、自然にbackgroundColorプロパティをサポートします。これはダーティで正当な方法ではありませんが、これまでのところステータスバーのカスタムカラーを設定する唯一の方法です(UINavigationBarアプローチを考慮せず、navbar + statusbarの外観を完全にカスタマイズできます)。アプリが拒否される可能性があります。しかし、多分あなたは幸運です。また、特定の複雑な状況(ネストされた子ナビゲーションとビューコントローラーの階層など)では、これがほとんど唯一の方法であるか、少なくともステータスバーの外観をカスタマイズする(たとえば、透過的にする)ための問題の少ない方法です。

Xcode 10 +、Swift 4.2

もう選択肢はありません。開発者は、フラグをYESに設定して(またはデフォルトでYESであるため、このアクションを省略して)、上記の指示に従って、ビューコントローラにステータスバーの外観を定義させる必要があります。


ボーナス

任意の段階でステータスバーの外観を自発的に変更するために、複雑な状況で使用することをお勧めしますが、推奨されないハックベースのソリューション。色に関して、次の拡張メソッドは、通常のアプローチで実行できることとまったく同じです。必要に応じて調整できます。

extension UIViewController {
    func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
            statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
            statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
        }
    }
}

2
ステータスバーを取得したら、次の操作も実行できます。statusBar.setValue(UIColor.red、forKey: "foregroundColor"); または、既存のキーを使用して、UIStatusBarには使用できるが、UIViewには使用できないプロパティを設定します
マーク

application.statusBarStyle = .lightContentこのアプローチは「statusBarStyle」のiOS9>セッターので、一般的であるが、iOSの9.0で廃止されました:使用- [のUIViewController preferredStatusBarStyle]、外出先への待ち時間がのUIViewControllerのためである
toxicsun

これは、アプリのカラーテーマを変更するときに機能する唯一のものです。ただし、一度設定すると、View Controllerを切り替えるときに常にリセットする必要があるようです。これ以降、preferredStatusBarStyle()メソッドは無視されます(info.plistが適切に設定されている場合でも)。
非自動の

2
この回答は、他の回答に比べて説明的です。
ViruMax

2
iOS 13.1でボーナスソリューションが壊れている
ViruMax

130

設定するのではなく、返された値をオーバーライドしようとすることができます。メソッドは{get}として宣言されているため、ゲッターを提供するだけです。

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

これを条件付きで設定する場合、setNeedsStatusBarAppearanceUpdate()準備ができたときに変更をアニメーション化するように呼び出す必要があります


2
prefersStatusBarHidden一部のビューでは選択できるため、これはより良いアプローチです。あなたが一緒に行くなら、あなたはUIApplication.shared.statusBarStyleそれで立ち往生するでしょう。
superarts.org

105

Swift 3&4、iOS 10&11、Xcode 9&10
私にとって、この方法は機能しません:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

私は各ビューコントローラーを使用していましたが、これはうまくいきました:

  • ファイルinfo.listで、row:View controller-based status bar appearanceを追加して、NO

  • 次にappdelegateで:

    UIApplication.shared.statusBarStyle = .lightContent

アプリのデリゲートにコードを追加した後でのみ試しましたが、info plistの設定が役に立ちました。ありがとう
Akhilesh Sharma 2017

6
'statusBarStyle'のセッターはiOS 9.0で廃止されました:-[UIViewController preferredStatusBarStyle]を使用してください
Reimond Hill

33

statusBarの色を白に変更したい場合は、に含まれるすべてのビューについてUINavigationController、これを中に追加しますAppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

このコード:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

しないために働くUIViewControllersに含まれているUINavigationControllerため、コンパイラのルックスを、理由statusBarStyleUINavigationControllerないため、statusBarStyleViewControllersそれに含まれます。

これが受け入れられた答えで成功しなかった人たちを助けることを願っています!


はい、どうもありがとう!ナビゲーションコントローラは、多くの人が考慮しなかったわずかなニュアンスでした!
Alexis Candelaria

26

ビューが表示された後いつでもステータスバーのスタイルを変更したい場合は、これを使用できます:

  • ファイルinfo.listに行を追加します:コントローラーベースのステータスバーの外観を表示してYESに設定します

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
そしてIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G

26

Xcode 10以降

Swift 5でテスト済み

以下の手順に従うだけで、コードは不要です。

アプリ全体でステータスバーを変更したい場合。

  1. プロジェクトナビゲーター(左側のパネル)から[プロジェクト]を選択します。
  2. ターゲットを選択します。
  3. 「一般」タブを選択します。
  4. 導入情報を見つけます。
  5. ステータスバーのスタイルをライトに変更します(暗い背景の場合は"Light"、明るい背景の場合は"Default")。

info.plistの変更を忘れないでください

  1. [情報]タブを選択します
  2. このキーをplistファイルに追加します "コントローラーベースのステータスバーの外観を表示します" =いいえ

プロジェクトを実行して確認します。

Swift 5およびXcode 10.2&11.0での私のプロジェクト


Xcode 10 / Swift5の場合、これは受け入れられる答えです。これが機能するには、両方の手順を実行する必要があります。
ジョンロビ

完璧です。ありがとうございました!これが実際に受け入れられる答えであるべきだと私は同意します。
DungeonDev

これは完璧な答え🤟🏻ある
nikhilgohil11は、

これは、xcode 11とswift 5で完全に機能します。おかげで
Luis Santiago

25

以下のキーをInfo.plistファイルに追加する必要があります。

View controller-based status bar appearance ブール値に設定 NO

appdelegateクラスで、didFinishLaunchingWithOptionsメソッドを返す前。

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
    statusBar.backgroundColor = UIColor.red
}
UIApplication.shared.statusBarStyle = .lightContent

変更backgroundColorおよびstatusBarStyle要件ごと。


素晴らしい解決策ですが、これはプライベートAPIの使用としてカウントされますか?
GoldenJoe

うまくいきますが、どうすればカスタムカラーに変更できますか?
iSrinivasan27 2017年

@MohanSrinivasan "UIColor.red"の代わりにカスタム色を指定できます。
Himanshu padia

13

ストーリーボードでもこれを行うことができます

  1. info.plistに新しいエントリを作成し、[コントローラベースのステータスバーの外観を表示する]を[はい]に設定します。
  2. ストーリーボードに移動し、変更するナビゲーションコントローラーを選択します。ストーリーボードドキュメントの概要セクションのナビゲーションバーをクリックします(ストーリーボードの左側のパネル)。
  3. 右側のパネルに移動して、属性セクションをクリックします
  4. ナビゲーションバーセクションの下にスタイルが表示されます。希望するスタイルを選択します(デフォルトは黒、黒は白です)

あなたが持っているナビゲーションコントローラごとにこれを行う必要があります。ただし、そのナビゲーションコントローラーの下にあるビューはすべて、ビューのすべてのステータスバーのスタイル/色を選択したものに変更します。結果を即座に確認でき、すべてのビューコントローラーにコード行を追加する必要がないため、このオプションの方が適しています。

ここに画像の説明を入力してください

(すべてのSwiftプロジェクトでXcode 8.3.3で実行)


「コントローラーベースのステータスバーの外観を表示する」を「いいえ」に設定する必要があります
Willjay

2
ビューコントローラーのコンテンツに応じてステータスバースタイルを設定する非常にクリーンな方法View controller-based status bar appearance = NOです。これは、アプリ全体で明るいスタイルまたは暗いスタイルのみを設定して使用する必要がある代わりに、正しい方法です。この「コードレス」の方法はナビゲーションコントローラーでのみ機能するのは残念です。アップルは、このオプションを設定するための別のフィールドをビューコントローラーインスタンス内に追加することを検討する必要があります。
aldoram5 2017

12

すべてのビューコントローラーのステータスバーを変更したい人のために:iOS 11、Swfit 4/5ソリューションは非常に簡単です。

1) Info.plist追加:

コントローラベースのステータスバーの外観を表示->いいえ

2) XCode選択プロジェクトの左側> ターゲット >プロジェクトを選択>一般の下で>展開情報>ステータスバーのスタイルを選択:ライト

1つのviewcontrollerのステータスバーのみを変更する場合は、viewDidLoadで次を追加します。

2.1)Info.plist

コントローラベースのステータスバーの外観を表示->はい

2.2

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

App Delegateから変更されたObjective-C(またはネイティブで反応):

1) Info.plist追加:

コントローラベースのステータスバーの外観を表示->いいえ

2) AppDelegate-> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

ステータスバーの変更は、プッシュ(ナビゲーションコントローラー)を実行しようとして機能、ビューコントローラーをモーダルで表示する場合にのみ機能します。


8

最初のステップとして、key:View controller-based status bar appearanceとvalue NOを含む行をInfo.plistファイルに追加する必要があります。その後、コントローラー内の2つの関数を、そのコントローラーのみが影響する特定のものに追加します。

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        UIApplication.shared.statusBarStyle = .default    
}

6

スウィフト3

Info.plistで、「ビューコントローラーベースのステータスバーの外観」という行を追加し、その値をに設定しますNo

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

ナビゲーションバーを処理するときに、ステータスバーのテキストの色について小さな問題があるようです。

.plistエントリの[ビューコントローラベースのステータスバーの外観]をに設定するYES場合、色付きのナビゲーションバーがあると機能しないことがあります。

例えば:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

そして

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

上記のコードは、AppDelegateで次のように設定した場合でも機能しません。

UIApplication.shared.statusBarStyle = .lightContent

まだ苦労している人のために、どうやらそれはどういうわけかステータスバーが明るいか暗いかをナビゲーションバーのスタイルで判断する必要があるかどうかを判断します。そこで、viewWillAppearに次の行を追加して、この問題を解決することができました。

nav?.barStyle = UIBarStyle.black

バーのスタイルが黒の場合、オーバーライドされた変数をリッスンします。これが誰かを助けることを願っています:)


6

@Krunalによって素晴らしいasnwerに追加するにはhttps://stackoverflow.com/a/49552326/4697535

を使用しているUINavigationController場合、preferredStatusBarStyleはには影響しませんUIViewController

Xcode 10およびSwift 4。

カスタムを設定する UINavigationController

例:

class LightNavigationController: UINavigationController {

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

アプリレベルのソリューションに拡張機能を使用する:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}

5

Xcode 8.3.1、Swift 3.1

  1. info.plistに新しいエントリを作成し、[コントローラベースのステータスバーの外観を表示]を[いいえ]に設定します。

  2. AppDelegate.swiftを開き、これらの行を「didFinishLaunchingWithOptions」メソッドに追加します。

application.statusBarStyle = .lightContent


5

スウィフト4+

白いステータスバーテキストの場合:

navigationController.navigationBar.barStyle = .blackTranslucent

5

ここにあるアップルのガイドライン/命令ステータスバーのスタイルの変更については。

ステータスバーのスタイル、アプリケーションレベルを設定UIViewControllerBasedStatusBarAppearanceする場合NOは、.plistファイルにを設定します。そして次のappdelegate> didFinishLaunchingWithOptionsに次のineを追加します(プログラムでアプリデリゲートから実行できます)。

目的C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

迅速

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

ステータスバーのスタイルを設定したい場合は、ビューコントローラーレベルで次の手順に従います。

  1. 設定するUIViewControllerBasedStatusBarAppearanceYESして.plist、あなただけのUIViewControllerレベルでセットステータスバーのスタイルに必要がある場合は、ファイル。
  2. viewDidLoad追加関数で- setNeedsStatusBarAppearanceUpdate

  3. ビューコントローラーでpreferredStatusBarStyleをオーバーライドします。

目的C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

迅速

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

ステータスバースタイルのセットアップレベルに従って.plistの値を設定します。

ここに画像の説明を入力してください


4

Swift 4.0「didFinishLaunchingWithOptions launchOptions:」Appdelegateクラスでこのコードを使用してください

UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){
  statusBar.backgroundColor = UIColor.black
}

4

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}

'blackOpaque'は使用できません:使用UIStatusBarStyleLightContent
Makalele

3

これは私のために働いた

plistのView controller-based status bar外観をNOに 設定してからUIViewController viewDidAppear、次の行を追加しました

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

setStatusBarStyleはiOS 9で非推奨になりました
Lastmboy '15年

3

迅速3

Info.plistのビューコントローラベースのステータスバーの外観= YESの場合

次に、すべてのNavigationControllerにこの拡張機能を使用します

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

UINavigationControllerがなく、UIViewControllerしかない場合は、以下のコードを使用します。

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

2
うまくいきません。「プロパティはスーパークラスのプロパティをオーバーライドしません」というエラーが表示され、「Objective-Cセレクターを使用した 'preferredStatusBarStyle'のGetterは、同じObjective-Cセレクターを使用した以前の宣言と競合します。
Theo

このおかげで、20回の試行と、これを試すためのいくつかの項目の組み合わせの後、これがステータスバーの色を設定する方法です。夜間モードで追加していて、黒地に黒が単に機能していなかったため、色を変更したい場合は、setNeedsStatusBarAppearanceUpdate()を呼び出すことを忘れないでください。
スチュアートP.

3

スウィフト5

https://stackoverflow.com/a/40066798/2082851PRAVEENの回答の詳細を追加するために、実装を提供したいと思います。各コントローラーのステータスバーをカスタマイズする柔軟性をサポートしています。

全体として、すべてのケースでプロパティBaseViewControllerを処理するを作成しますstatusBarStyle。新しいコントローラーを作成するときは、この基本コントローラーのサブクラスにします。

ステータスの外観を変更する場合は、このプロパティを更新するだけで済みます。ステータスバーのスタイルはすぐに更新されます。

実装

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

デモ

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

ここに画像の説明を入力してください

2。 UINavigationController

の場合UINavigationController、これは特別なケースであり、いずれかの解決策に従うことができます。

ソリューションA:メッセージディスパッチでオーバーライドする

UINavigationControllerはとNSObjectから継承されるためObjectiveC、そのメソッドはでmessage dispatchあり、それらをオーバーライドできます。

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

解決策B:UINavigationControllerサブクラスを作成する

カスタムUINavigationController(通常はより多くの要件を制御する必要がある)がすでにある場合は、これが最適なソリューションです。

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

「shouldStatusBarDark」という名前のboolプロパティを使用して、ステータスバーの色を切り替えることができます。また、その値を更新して、スクロール時にステータスバーの色を変更することもできます。

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }

navViewプロパティとは ソリューションを共有していただきありがとう
ござい

1
@medskill navViewは、プログラムによって追加された単なる模倣ナビゲーションバーです。
tiantong

2

これらの回答のほとんどは同じものを再ハッシュ化したものですが、暗い背景を使用している場合、実際には起動画面に対応するものはありません。

私は私の中info.plistで次のようにしてこれを回避しました。これは軽いスタイルのステータスバーを生成しました。

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

次の警告が表示された場合:Setter for 'statusBarStyle' is deprecated in iOS 9.0:Use-[UIViewController preferredStatusBarStyle]、次にステータスバーを明または暗に設定するには、次のコードを使用します。

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

これはnavBarを変更するものではなく、純粋にスタイルを示すため、それに応じてステータスバーを変更します。

NB。info.plistに設定する必要があります。

View controller-based status bar appearance to YES

2

モーダルプレゼンテーションを使用している場合は、以下を設定する必要があります。

viewController.modalPresentationCapturesStatusBarAppearance = true


1

それでもメソッドに基づいてステータスバーのスタイルを変更できない場合

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

この方法を試してみてください:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}

0

目的Cの場合、この行をアプリケーションのdidFinishLaunchメソッドに追加するだけです

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
これは、iOS 9以降廃止されました
MK_Dev

0

WebkitViewの使用

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

3
Swift 9.3?間違った年、マーティ
iOSユニット

例として "statusBar"にプライベートAPIを使用しないことをお勧めします。AppleはAPIを随時変更しています!また、アップルがそのAPIを変更すると、アプリがクラッシュし、ステータスバーが変更されなくなります。これにより、別のソリューションを再度検索することができます。
Doci
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.