web-dev-qa-db-ja.com

iOS 8でSwiftを使用して特定のViewControllerのステーターバーの色を変更する

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

特定のViewControllerに対してstatusBarの色をWhiteに設定するために任意のViewControllerで上記のコードを使用するは、私にとってはiOS 8では機能しません。助言がありますか? UIApplication.sharedApplicationメソッドを使用すると、アプリ全体のInfo.plistで必要な変更が行われた後に色が変わります。

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

必要な固有のViewControllerに対して、ステータスバーの色を変更するにはどうすればよいですか。

159
Anuj

すべての提案を読み、いくつかのことを試した後、次の手順を使用して特定のビューコントローラに対してこれを機能させることができます。

第一歩:

Info.plistを開き、「View Controllerベースのステータスバーの外観」という名前の新しいキーをに挿入します。いいえ

第2ステップ(単なる説明、これを実装する必要はありません):

通常、AppDelegateのアプリケーション(_:didFinishLaunchingWithOptions :)メソッドに次のコードを追加します。

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

しかしそれはすべてのViewControllerのstatusBarStyleに影響します。

では、特定のViewControllerに対してこれを機能させる方法 - 最終ステップ:

statusBarStyleを変更したいビューコントローラファイルを開き、以下のコードをviewWillAppear()に入力します。

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

また、その特定のviewControllerに対してviewWillDisappear()メソッドを実装し、次のコード行を追加します。

Swift 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

Swift 3

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

この手順では、まず特定のビューコントローラのstatusBarStyleを変更し、次に特定のビューコントローラが消えるとそれをdefaultに戻します。 viewWillDisappear()を実装しないと、statusBarStyleは永続的に新しい定義済みのUIStatusBarStyle.LightContentに変更されます。

330
Anuj

(2019年3月14日現在)

Swift 4Swift 4.2

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
70
BennyTheNerd

私はこのチュートリアルに従った、そしてそれは私のために働いた。ただし、警告があるかどうかはわかりません。

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-Swift

  • Info.plistを開き、UIViewControllerBasedStatusBarAppearancefalseに設定します。
  • didFinishLaunchingWithOptionsを含むAppDelegate.Swiftの最初の関数で、必要な色を設定します。

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3 Update*

    UIApplication.shared.statusBarStyle = .lightContent

26
chris_s

ここには10億の答えがあるので、私はなぜ拡張子の形で別のものを追加しないのかと思いました(@Cœurの助けを借りて)

スイフト3

拡張:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

実装:

UIApplication.statusBarBackgroundColor = .blue
17
John R Perry

Info.plistで、View Controllerベースのステータスバーの外観を任意の値に定義する必要があります。

YESと定義した場合は、各View ControllerのpreferredStatusBarStyle関数をオーバーライドする必要があります。

NOと定義した場合は、AppDelegateで次のようにスタイルを設定できます。

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
16
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}
14
A.G

NavigationControllerによるSwift 4.2ソリューション

第一歩:

Info.plistを開き、 "View Controllerベースのステータスバーの外観"またはUIViewControllerBasedStatusBarAppearance toYESという新しいキーを挿入します各VCに独自のstatusプロパティを使用させる。

第2ステップ

各VCで、次のようにpreferredStatusBarStyleプロパティをオーバーライドします。

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

最後のステップ

カスタムNavigationControllerクラスのpreferredStatusBarStyleプロパティをオーバーライドします。

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}
13
guillama

Swift 3

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

これが、特定のView Controllerのステータスバーの背景色を設定するための解決策です。

12
Chris Tsitsaris

Swift 2

私のviewWillAppearに以下を追加することでステータスバーの背景の外観を変更することに成功しました。

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
12
A.J. Hernandez

swift 3用

.plist

View controller-based status bar appearance = NO

AppDelegate.Swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }
9
Giang

私の状況では、ストーリーボードを使ってView Controllerを整理しています。ステータスバーのスタイルをすべて変更したいのですが。

あなたは下の絵で見ることができます。

enter image description here

Stars View ControllerはCPBaseNavigationControllerで、CPBaseNavigationControllerUINavigationControllerのサブクラスです。

次の準備をしてみます。

  1. AppDelegate.Swift func didFinishLaunchingWithOptionsに、追加

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    しかし効果はありません。

  2. StoryBoardでBase Tab BarControllerを見つけます(上の画像)。Attributes Inspectorを選択し、Sattus Bar属性をLight Content.soに変更します。

enter image description here

  1. 私のカスタムナビゲーションコントローラCPBaseNavigationControllerに、func preferredStatusBarStyleを追加します。

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

    それはうまくいきます!

さらに、9.0では廃止予定のstatusBarStyleには、-[UIViewController preferredStatusBarStyle]を使用できます。

8
wenghengcong

前述のようにpreferredStatusBarStyleを実装し、ViewDidLoad内でself.setNeedsStatusBarAppearanceUpdate()を呼び出し、さらにInfo.plist内でUIViewControllerBasedStatusBarAppearanceYESに設定します(デフォルトではYES)。

それが機能していない理由は明確ではありません。コードを確認する必要があります。他の提案はviewDidLoadUIApplication.sharedApplication().statusBarStyle = .LightContentの作業コードで行って、表示が消えたときにこれをデフォルトに変更するviewWillDisappearです。

8
codester

Swift 3

//
//  LoginController.Swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
7
theCrab

ナビゲーションベースのアプリケーションのための作品

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
7
Jio

Swift 3.0 Xcode 8ではすべてがはるかに簡単になりました

以下のコードをApp Delegateファイルで使用した後、

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

これを挿入してください:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
7
Anton Russia

Swift 4ナビゲーションなしの特定のViewControllerについては、ViewControllerファイルに追加するだけです。

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
6
Surjit Singh

App Delegateファイルで以下のコードを使用して、特定の色(RGBフォーマット)を設定しました。

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

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

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

ビューベースのステータスバーの外観 ブール値を に設定 _ _ _ _//

Screenshot 1

Screenshot 2

3

私はこれにいくらか問題がありました。私は、ビュー内のステータスバーの色をグローバルに変更してからビューに戻すと、受け入れられた答えのように消えてしまうことについて、あまり気にしませんでした。信じられないかもしれませんが、希望するView ControllerでpreferredStatusBarStyleをオーバーライドすることでこれを機能させることができます。久しぶりにこれは私がそれを動かすためにしたことです:

  1. info.plistのView Controllerベースのステータスバーの外観をYESに変更します。
  2. フルスクリーンのView Controllerは、preferredStatusBarStyleをオーバーライドすることでステータスバーのスタイルを変更できるようになりました。
  3. フルスクリーンを指定するのは、フルスクリーンではない(フルスクリーンではない)モーダルView Controllerでは機能しないからです。modal​Presentation​Captures​Status​Bar​AppearanceをYesに設定しないとそうではありません。
  4. また、たとえばNavigation Controllerのように、View Controllerが埋め込まれている場合は、一番上のView Controllerにステータスバースタイルを要求します。 child​View​Controller​For​Status​Bar​Styleをオーバーライドして埋め込みView Controllerを渡すことは機能するはずですが、それは私にとってはうまくいきませんでした。だから私はちょうど優先ステータスバーのスタイルとして埋め込みView Controllerの優先ステータスバーを返しました。このようなもの:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
    
2
John C.

もっと簡単な方法を提案できます。

  1. Appleのドキュメントにあるように、viewDidLoadで setNeedsStatusBarAppearanceUpdate を呼び出すだけです。

非表示/非表示ステータスやスタイルなどのView Controllerのステータスバー属性が変更された場合は、このメソッドを呼び出します。アニメーションブロック内でこのメソッドを呼び出すと、変更はアニメーションブロックの他の部分と共にアニメーション化されます。

  1. 好みの型を返す preferredStatusBarStyle を実装します。

それはiOS 10.1で私のために働きました。

目標C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

スイフト

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

私は誰もこれを指摘していないのに驚いています。とにかくお楽しみください:)

2
Bhaumik Desai

ストーリーボードで私と一緒に働いたことは、Navigation Controllerに行き、ナビゲーションバーを選択し、Attributes Inspectorをクリックし、そしてスタイルをデフォルトから黒に変更することです。それでおしまい!

1
Amr

Swift 3.0アップデート

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
1
Jaseibert

これを機能させるもう1つの本当に簡単な方法は、UINavigationControllerクラスの拡張を作成することです。

preferredStatusBarStyle:メソッドをオーバーライドしても動作しませんの場合を除き、UINavigationControllerクラスの内部で行います。

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

Swift 4または4.2では

あなたはあなたのvcに追加することができます

preferredStatusBarStyle

戻り値を

.lightContentまたは.default

例:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}
1
Ridho Octanio

[Supporting Files]グループ(左側の上部 - プロジェクトの名前)をクリックします。情報に移動します。バンドル名の下のように、リストの間のどこかで+をクリックします。そして、「View controller-based status bar appearence」を追加して、それをNOに設定します。次にAppDelegate.Swiftを開き、次のように変更します。

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

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

return true
}

それでおしまい。

0

Swift4の特定のView Controller用のナビゲーションベースの機能

   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

Xcode 10では、クラスを作成してviewControllerクラスの前に配置することができます。すべてのView Controllerでこのクラスを呼び出すことができます。ライトコンテンツステータスバーが必要です。

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

それでは、viewControllerクラスを次のように変更してください。

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

そしてそれだけです...

0
Fabio

警告


'statusBarStyle'のセッターはiOS 9.0で廃止されました:使用 - [UIViewController preferredStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

だから私の解決策はこのようだった:ナビゲーションコントローラからの拡張を作る:

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

        return .default
    }
}

アプリのスタイル以外のスタイルを持つviewControllerがある場合は、これを作成できます。

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

アプリのステータススタイルが.defaultで、この画面を.lightContentにすると、barStyleは.lightContentをデフォルト値として使用します。これにより、ステータスバーのスタイルはlightContentに変更され、viewWillDisappearがbarStyleを我々の場合は.defaultです。

これは私には有効です

0
hesham ghalaab

Swift 4.2ねえ、私がGraig Grummittによるこの省略可能な主題に関する素晴らしい記事から得た解決策を共有したいと思いました。

ステップ1他の人があなたのPLISTに以下の追加を述べたように

View controller-based status bar appearance YES

RootViewcontrollerのステップ2を以下に追加します。

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

プロパティstatusBarHiddenまたはvcStatusBarStyleを更新すると、setNeedsStatusBarAppearanceUpdate()が呼び出され、prefersStatusBarHiddenまたはpreferredStatusBarStyleのいずれかの新しい値でステータスバーが更新されます。私の状況では、私はコンテナのviewcontrollerのためにこれらのプロパティを更新しなければなりませんでした、それは見えるchildviewcontrollerの親でした。私はこれを単純なデリゲートメソッドを使って行いました。

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

もちろん、childViewController(Visible VC)をインスタンス化するときには、MainViewcontroller(Container VC)をそのデリゲートとして設定することを忘れないでください。私は時々します。 :)

childViewController.delegate = self

次に、childViewControllerで、ステータスバーを更新するために必要なときにデリゲートメソッドを呼び出しました。

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

上記のようにGraig Grummittは、このソリューションとUINavigationControllersとの連携についても詳しく説明しています。ここにリンク: ステータスバーの不思議な例

0
Erik Uecke

私は文字通りこの同じ問題に陥りました。それを把握するために4時間かけて私を連れて行って。私はここで与えられたすべての答えを試してみました、そして私が得た最良のものはステータスバー白への見出しを得ることでした。しかし、バッテリーバーなどの他の部分は、私が何をしても黒いままでした。この質問で提供されているすべての解決策を適用することに関してです。そこで私は自分のステップをさかのぼることにし、Xcodeの通常の機能と色を変えるコードを変更していたCocoaPod依存関係をダウンロードしたことを知りました。私にとっては、それは "ChameleonFramework"依存でした。だから私はあなたがあなたがCocoaPodsからインストールしたあなたの依存関係をあなたがすべての解決策を適用して、あなたのために働いていないなら最新のものを削除することによってチェックすることを勧めます。

0
Martin Q