私はXcode 8.0 beta 4を使っています。
以前のバージョンでは、UIViewControllerはステータスバーのスタイルを設定するメソッドを持っていました
public func preferredStatusBarStyle() -> UIStatusBarStyle
しかし、Swift 3では "Get ONLY varaiable"に変更されています。
public var preferredStatusBarStyle: UIStatusBarStyle { get }
UIViewControllerで使用するスタイルをどのように提供できますか?
これは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
この記事は、過去数年間に存在したさまざまなアプローチの背後にあるロジックを理解したい人のためにそのまま残されています。一方、Xcode 10、Swift 4.2最初のアプローチは非推奨 の時点で、サポートされなくなりました(つまり使用しない使用しようとすると有効になります)。 Plist.info
フラグとカスタマイズの習慣の背後にある理由をよりよく理解するために、あなたの情報を参照しています。
ステータスバーの外観をカスタマイズする2つのアプローチを理解することは非常に重要です。それらは異なっており、混合すべきではありません。
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でこの設定を再確立する必要がなくなります。ただし、いつでもこの方法を使用して、外観を自発的に変更できます。
これは逆です。動作させるには、info.plistに移動して設定します
View controller-based status bar appearance
to YES
このように、新しいView Controllerが開いているときはいつでも、必要な各UIViewController
インスタンスにこの実装を挿入すると、ステータスバーのスタイルが個別に設定されます。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
最初と同じように、各View Controllerに個別にステータスバーに暗いスタイルまたは明るいスタイルを設定します。
このプロパティは、2つのシナリオでUIKitによって取得されます。
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")
}
}
}
設定するのではなく、返された値を上書きすることを試みることができます。このメソッドは{get}として宣言されているので、単にgetterを指定します。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
これを条件付きで設定した場合、準備ができたら変更をアニメーション化するためにsetNeedsStatusBarAppearanceUpdate()
を呼び出す必要があります。
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
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
で動作します。これは、コンパイラがstatusBarStyle
のUINavigationController
を検索するためではなく、statusBarStyle
のViewControllers
を検索するためです。
これが受け入れられた答えで成功しなかった人々を助けることを願っています!
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
要件に従ってbackgroundColor
とstatusBarStyle
を変更します。
ビューが表示された後にいつでもステータスバーのスタイルを変更したい場合は、これを使用できます。
ファイル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
}
}
ストーリーボードでもできます
あなたはあなたが持っているそれぞれのナビゲーションコントローラのためにこれをしなければならないでしょう。ただし、そのナビゲーションコントローラの下にあるビューは、ビューのステータスバーのスタイル/色をすべて選択したものに変更します。即座に結果を確認でき、すべてのView Controllerに余分なコード行を追加する必要がないため、このオプションの方が適しています。
(全SwiftプロジェクトでXcode 8.3.3を使用)
最初のステップとして、キー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
}
ナビゲーションバーを扱うときにステータスバーのテキストの色について小さな問題があるようです。
.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
バースタイルが黒の場合は、上書きされた変数を監視します。これが誰かに役立つことを願っています:)
スイフト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()
}
}
Xcode 8.3.1、Swift 3.1
Info.plistの「View controller-based status bar appearance」に新しいエントリを作成し、「NO」に設定します。
AppDelegate.Swiftを開き、 "didFinishLaunchingWithOptions"メソッドに次の行を追加します。
application.statusBarStyle = .lightContent
IOS 11上のすべてのビューコントローラのステータスバーを変更しようとしている人にとって、Swfit 4ソリューションは非常に簡単です。
1) Info.plist追加:
コントローラベースのステータスバーの外観を表示 - > NO
2) XCodeの左側にあるプロジェクトを選択> ターゲット >プロジェクトを選択>一般>配置情報>ステータスバーのスタイルの選択:ライト
1つのviewcontroller に対してのみステータスバーを変更したい場合は、viewDidLoadに以下を追加してください。
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
@Krunal 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
}
}
}
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
}
こちらは アップルのガイドライン/使用方法 ステータスバーのスタイル変更についてです。
ステータスバーのスタイルを設定したい場合は、アプリケーションレベルで.plist
ファイルのUIViewControllerBasedStatusBarAppearance
をNO
に設定します。そしてあなたの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レベルで次の手順に従います。
.plist
ファイルでUIViewControllerBasedStatusBarAppearance
をYES
に設定します。ViewDidLoadに関数を追加する - setNeedsStatusBarAppearanceUpdate
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の値を設定します。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
これは私のために働きました:)私はナビゲーションバーを隠して私のView Controllerに埋め込まれたNavigation Controllerを持っています。私はいくつかのviewsinアプリでステータスバーを点灯させたいと思いました。
スイフト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
}
}
これは私のために働きました
PlistでView controller-based status bar
の外観を _ no _ に設定し、次にUIViewController
viewDidAppear
に次の行を追加します。
UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Swift 4+
白いステータスバーテキストの場合:
navigationController.navigationBar.barStyle = .blackTranslucent
ステータスバーの色を切り替えるには、「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
})
}
}
これらの答えのほとんどは再ハッシュ化されたものと同じものですが、暗い背景を使用しているときに実際に起動画面に対処するものはありません。
私はinfo.plist
で次のようにしてこれを回避しました。これは明るいスタイルのステータスバーを生成しました。
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
モーダルプレゼンテーションを使用している場合は、次を設定する必要があります。
viewController.modalPresentationCapturesStatusBarAppearance = true
あなたは全体のアプリでステータスバーを変更したい場合。
info.plistの変更を忘れないでください
プロジェクトを実行して確認してください。
Swift 5とXcode 10.2での私のプロジェクト
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
}
Info.plistに次の行を追加してください。
"View Controllerベースのステータスバーの外観= NO"
そして、あなたのコードに次のスニペットを追加して、出力を見てください。
UIApplication.shared.statusBarStyle = .lightContent
UIApplication.shared.statusBarStyle = .default
Objective Cでは、アプリケーションのdidFinishLaunchメソッドにこの行を追加するだけです。
UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
私は得ていました:
オーバーライドするvarは、それを囲む型と同じくらいアクセス可能でなければなりません
これはpublic
を追加することで修正されます。
override public var preferredStatusBarStyle: UIStatusBarStyle {
get {
return .lightContent
}
}
Swift3 iOS10上で。
警告が表示される場合は、'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
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
}
}