web-dev-qa-db-ja.com

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

私はXcode 8.0 beta 4を使っています。

以前のバージョンでは、UIViewControllerはステータスバーのスタイルを設定するメソッドを持っていました

public func preferredStatusBarStyle() -> UIStatusBarStyle

しかし、Swift 3では "Get ONLY varaiable"に変更されています。

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

UIViewControllerで使用するスタイルをどのように提供できますか?

161
Willjay

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

アプリケーションのInfo.plistで、[View controller-based status bar appearance]をYESに設定します。

それぞれのView ControllerでpreferredStatusBarStyleをオーバーライドしてください 。例えば:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

View Controller内で変化するものに基づいて別の優先ステータスバースタイルを返すpreferredStatusBarStyleがある場合(たとえば、スクロール位置や表示されている画像が暗いかどうか)、その状態が変化したときにsetNeedsStatusBarAppearanceUpdate()を呼び出します。

ナビゲーションコントローラを使用していて、各View Controllerのステータスバーのスタイルを優先したい場合は、 https://stackoverflow.com/a/41026726/1589422 を参照してください。

バージョン7より前のiOS、廃止予定のメソッド

アップルはこれを非推奨にしました したがって、将来削除される予定です。次のiOSバージョンがリリースされたときに書き換える必要がないように、上記の方法を使用してください。

あなたのアプリケーションがあなたのアプリケーションのInfo.plistをサポートするならば、 "View controller-based status bar appearance"をNOに設定してください。

didFinishLaunchingWithOptions関数のappDelegate.Swiftに、以下を追加します。

UIApplication.shared.statusBarStyle = .lightContent
438
PRAVEEN

最新のアップデート(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で個別に定義されていないと言う設定を確立します。これを理解することは非常に重要です。これは、all画面の場合、アプリ全体に均一な設定があることを意味します。 2つの設定があります:default、これは白い背景に黒いテキスト、またはlightContent、黒い背景に白いテキストです。

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

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

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

2番目のアプローチ-各View Controllerの個別の色

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

View controller-based status bar appearance

to YES

このように、新しいView Controllerが開いているときはいつでも、必要な各UIViewControllerインスタンスにこの実装を挿入すると、ステータスバーのスタイルが個別に設定されます。

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

最初と同じように、各View Controllerに個別にステータスバーに暗いスタイルまたは明るいスタイルを設定します。

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

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

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

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

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

func toggleAppearance() {
   isDark.toggle()
}

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

第三のアプローチ–ハック!

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

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を使用します。 KVCを使用してstatusBarオブジェクトを取得し、その背景色を設定します。この方法で取得するオブジェクトはUIStatusBarであり、これはUIViewから派生しているため、当然backgroundColorプロパティをサポートします。これは汚い、合法的な方法ではありませんが、これまでのところ、ステータスバーのカスタム色を設定する唯一の方法です(UINavigationBarアプローチを考慮せず、navbar + statusbarの外観を完全にカスタマイズできます)。アプリが拒否される可能性があります。しかし、あなたは幸運かもしれません。そして、あなたがいる場合、特定の複雑な状況(ネストされた子ナビゲーションとView Controllerの階層など)では、これがほとんど唯一であるか、少なくとも面倒なステータスバーの外観をカスタマイズする方法(たとえば、透明にする)

Xcode 10 +、Swift 4.2

開発者は、フラグをYESに設定して(またはデフォルトではYESであるため、このアクションを省略して)eachコントローラーにステータスバーの外観を定義させます)および上記の指示に従ってください。


ボーナス

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

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")
        }
    }
}
149
Hexfire

設定するのではなく、返された値を上書きすることを試みることができます。このメソッドは{get}として宣言されているので、単にgetterを指定します。

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

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

128
Abizern

Swift 3&4、iOS 10&11、Xcode 9&10
私にとっては、この方法はうまくいきません。

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

各View Controllerを使用していたときには、これでうまくいきました。

  • Info.listファイルにrow:View controller-based status bar appearanceを追加し、NOに設定します。

  • 次にappdelegate:

    UIApplication.shared.statusBarStyle = .lightContent
    
99
Gracu

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を検索するためです。

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

26
Mr. Xcoder

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

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

あなたのapplelegateクラスでは、戻る前に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

要件に従ってbackgroundColorstatusBarStyleを変更します。

25
Himanshu padia

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

  • ファイル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 
        } 
    }
    
24

ストーリーボードでもできます

  1. Info.plistの「View controller-based status bar appearance」に新しいエントリを作成し、それを「YES」に設定します。
  2. ストーリーボードに移動して、変更したいナビゲーションコントローラを選択します。ストーリーボードドキュメントのアウトラインセクション(ナビゲーションボードの左側のパネル)からナビゲーションバーをクリックします。
  3. 右側のパネルに移動して「属性」セクションをクリックします
  4. ナビゲーションバーセクションの下にスタイルが表示されます。好みのスタイルを選択します(デフォルトは黒、黒は白)

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

enter image description here

(全SwiftプロジェクトでXcode 8.3.3を使用)

13
Bryan Norden

最初のステップとして、キーView controller-based status bar appearanceと値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    
}
8
javimuu

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

.plistエントリのView controller-based status bar appearanceを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
nCr78

スイフト3

Info.plistに「View controller-based status bar appearance」という行を追加し、その値をNoに設定します。

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}
6
youareawaitress

Xcode 8.3.1、Swift 3.1

  1. Info.plistの「View controller-based status bar appearance」に新しいエントリを作成し、「NO」に設定します。

  2. AppDelegate.Swiftを開き、 "didFinishLaunchingWithOptions"メソッドに次の行を追加します。

application.statusBarStyle = .lightContent

5
joemalski

IOS 11上のすべてのビューコントローラのステータスバーを変更しようとしている人にとって、Swfit 4ソリューションは非常に簡単です。

1) Info.plist追加:

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

2) XCodeの左側にあるプロジェクトを選択> ターゲット >プロジェクトを選択>一般>配置情報>ステータスバーのスタイルの選択:ライト

1つのviewcontroller に対してのみステータスバーを変更したい場合は、viewDidLoadに以下を追加してください。

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
5
Doca

@Krunal https://stackoverflow.com/a/49552326/4697535 _で偉大な答えを追加する

UINavigationControllerを使用している場合、preferredStatusBarStyleUIViewControllerに影響を与えません。

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
      }
  }
}
4
Tal Zion

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
Karthickkck

こちらは アップルのガイドライン/使用方法 ステータスバーのスタイル変更についてです。

ステータスバーのスタイルを設定したい場合は、アプリケーションレベルで.plistファイルのUIViewControllerBasedStatusBarAppearanceNOに設定します。そしてあなたのappdelegate> didFinishLaunchingWithOptionsに以下を追加してください(プログラム的にあなたはappデリゲートからそれを行うことができます)。

目標C

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

速い ​​

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

ステータスバーのスタイルを設定したい場合は、View Controllerレベルで次の手順に従います。

  1. ステータスバーのスタイルをUIViewControllerレベルでのみ設定する必要がある場合は、.plistファイルでUIViewControllerBasedStatusBarAppearanceYESに設定します。
  2. ViewDidLoadに関数を追加する - setNeedsStatusBarAppearanceUpdate

  3. view Controllerで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の値を設定します。

enter image description here

4
Krunal
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

これは私のために働きました:)私はナビゲーションバーを隠して私のView Controllerに埋め込まれたNavigation Controllerを持っています。私はいくつかのviewsinアプリでステータスバーを点灯させたいと思いました。

3

スイフト3

info.plistでView Controllerベースのステータスバーの外観がYESの場合

それからすべてのNavigationControllerにこの拡張子を使います

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

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

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

これは私のために働きました

PlistでView controller-based status barの外観を _ no _ に設定し、次にUIViewControllerviewDidAppearに次の行を追加します。

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

Swift 4+

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

navigationController.navigationBar.barStyle = .blackTranslucent
2
Alfi

ステータスバーの色を切り替えるには、「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
         })
     }
 }
2
tiantong

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

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

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
2
CodeBender

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

viewController.modalPresentationCapturesStatusBarAppearance = true
1
RomanMisnikov

Xcode 10以降

以下の手順に従ってコードを追加する必要はありません。

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

  1. Project Navigator(左側パネル)からProjectを選択します。
  2. ターゲットを選択してください。
  3. 全般タブを選択します。
  4. 展開情報を見つけます。
  5. ステータスバーのスタイルを ライト に変更します(暗い背景の場合 "明るい" 、明るい背景の場合 "デフォルト" )。

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

  1. 情報タブを選択
  2. このキーをplistファイルに追加してください "View controller-based status bar appearance" = NO

プロジェクトを実行して確認してください。

Swift 5とXcode 10.2での私のプロジェクト

1
Vivek

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
}
1
Satish Babariya

Info.plistに次の行を追加してください。

"View Controllerベースのステータスバーの外観= NO"

そして、あなたのコードに次のスニペットを追加して、出力を見てください。

        UIApplication.shared.statusBarStyle = .lightContent
        UIApplication.shared.statusBarStyle = .default
0
Nrv

Objective Cでは、アプリケーションのdidFinishLaunchメソッドにこの行を追加するだけです。

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
0
Asfand Shabbir

私は得ていました:

オーバーライドするvarは、それを囲む型と同じくらいアクセス可能でなければなりません

これはpublicを追加することで修正されます。

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

Swift3 iOS10上で。

0
James BH

警告が表示される場合は、'statusBarStyle'の設定は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

これによってナビゲーションバーが変更されることはありません。それは純粋にスタイルを示しているため、それに応じてステータスバーが変更されます。

NB。 info.plistに設定したことを確認する必要があります。

View controller-based status bar appearance to YES
0
Richard Hope

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
    }

}
0
Oracular Man