Zmiana koloru paska stanu dla określonych kontrolerów widoku za pomocą Swift w iOS8

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

Użycie powyższego kodu w dowolnym Viewcontrollerze, aby ustawić kolor paska stanu na Biały dla określonego viewcontrollera doesnt work in iOS8 for me. Jakieś sugestie? Korzystanie z aplikacji.metoda sharedApplication, kolor zmienia się po wymaganych zmianach w informacji.plist dla całej aplikacji.

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

Jak mogę po prostu wprowadzić zmiany w Kolorze paska stanu dla niektórych wymaganych i szczegółowe Kontrolery widoków?

Author: Anuj, 2014-11-16

24 answers

Po przeczytaniu wszystkich sugestii i wypróbowaniu kilku rzeczy, mogłem uruchomić to dla konkretnych kontrolerów viewcontrollerów, wykonując następujące kroki:]}

Pierwszy Krok:

Otwórz swoje informacje.plist i włóż nowy klucz o nazwie " Zobacz wygląd paska stanu opartego na kontrolerze", aby Nie.

Drugi krok (tylko Wyjaśnienie, nie trzeba tego wdrażać):

Normalnie umieszczamy następujący kod w aplikacja (_: didFinishLaunchingWithOptions:) metoda AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Ale to wpływa na statusBarStyle wszystkich kontrolerów widoku.

Tak więc, jak to działa dla konkretnych kontrolerów Viewcontrollerów-ostatni krok:

Otwórz plik viewcontroller, w którym chcesz zmienić statusBarStyle i umieść następujący kod w viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Zaimplementuj również metodę viewWillDisappear() dla tego konkretnego kontrolera viewcontrollera i umieść następujące linie kodu,

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
}

Ten krok najpierw zmieni statusBarStyle dla określonego viewcontrollera, a następnie zmieni go z powrotem na default, gdy określony viewcontroller zniknie. Nie implementacja viewWillDisappear() zmieni na stałe statusBarStyle na nową zdefiniowaną wartość UIStatusBarStyle.LightContent

 317
Author: Anuj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 12:22:45

(od maja 23, 2018)

Swift 3 i Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.shared.statusBarStyle = .lightContent
}
override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
 48
Author: BennyTheNerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 19:20:10

Zastosowałem się do tego tutoriala i zadziałało na mnie. Nie jestem jednak pewien, czy są jakieś zastrzeżenia.

Https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • otwórz swoje informacje.plist I set UIViewControllerBasedStatusBarAppearance do false.
  • w pierwszej funkcji AppDelegate.swift, która zawiera didFinishLaunchingWithOptions, ustaw żądany kolor.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3 Update *

    UIApplication.wspólne.statusBarStyle = .lightContent

 24
Author: chris_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-11 12:01:40

W Twoich informacjach.plist musisz zdefiniować wygląd paska stanu w oparciu o kontroler widoku na dowolną wartość.

Jeśli zdefiniujesz ją tak, powinieneś zastąpić funkcję preferredStatusBarStyle w każdym kontrolerze widoku.

Jeśli zdefiniujesz go NO, możesz ustawić styl w AppDelegate używając

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
 15
Author: Nikita Khandelwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 09:00:03
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()
    }

}
 12
Author: A.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-11 08:38:03

Jest tu miliard odpowiedzi, więc pomyślałem, dlaczego nie dodać kolejnej w formie rozszerzenia (z pomocą @Cœur)

Swift 3

Rozszerzenie:

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

Realizacja:

UIApplication.statusBarBackgroundColor = .blue
 12
Author: John R Perry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 22:49:11

SWIFT 2

Udało mi się z powodzeniem zmienić wygląd tła paska stanu, dodając w moim viewWillAppear:

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

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
 11
Author: A.J. Hernandez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-26 04:23:31

Swift 3

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

To rozwiązanie służące do ustawiania koloru tła paska stanu dla określonego kontrolera widoku.

 11
Author: Chris Tsitsaris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 10:09:42

Zaimplementuj preferredStatusBarStyle jak już wspomniałeś i wywołaj self.setNeedsStatusBarAppearanceUpdate() w ViewDidLoad i również w Info.plist ustawia UIViewControllerBasedStatusBarAppearance na YES (domyślnie jest to YES)

Nie jest jasne, dlaczego nie działa.Muszę sprawdzić kod.Jeszcze jedna sugestia to go with working code in viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent i zmień to na domyślne po wyświetleniu get disappeared viewWillDisappear.

 7
Author: codester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-17 17:00:13

W mojej sytuacji używam storyboardu do organizowania kontrolerów widoku.Chcę zmienić styl paska stanu.

Możesz zobaczyć na zdjęciu poniżej.

Tutaj wpisz opis obrazka

Stars kontroler widoku jest CPBaseNavigationController, a {[3] } jest podklasą UINavigationController.

Staram się robić następne sety:

  1. W AppDelegate.swift func didFinishLaunchingWithOptions, Dodaj

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

    Ale bez efektu.

  2. W StoryBoard,znaleźć Base Tab BarController (zdjęcie na powyższym).wybierz Attributes Inspector, Zmień Sattus Bar przypisać do Light Content. tak źle, brak efektu.

Tutaj wpisz opis obrazka

  1. Last I get it.In my custom navigation controller CPBaseNavigationController, add func preferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }
    
    To działa dobrze!

Poza tym, statusBarStyle przestarzałe w 9.0, można użyć -[UIViewController preferredStatusBarStyle].

 7
Author: wenghengcong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-10 03:09:07

Dla 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
    }
 7
Author: Giang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 04:06:12

Działa dla aplikacji opartych na Nawigacji

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
 6
Author: Jio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 07:42:56

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
    }
}
 6
Author: theCrab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-12 15:33:52

Wszystko jest o wiele łatwiejsze w Swift 3.0 Xcode 8

Używając poniższego kodu w pliku App Delegate, po

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

Wstaw to:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
 5
Author: Anton Russia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-07 00:18:40

Ustawiłem konkretny kolor (w formacie RGB) używając poniższego kodu w pliku App Delegate:

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)
        }

. . .
}

Należy również dodać poniżej klucz w pliku Info.plist:

Zobacz wygląd paska stanu opartego na kontrolerze z wartością logiczną ustawioną na NO

Zrzut ekranu 1

Zrzut ekranu 2

 3
Author: Jayprakash Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 09:41:41

Swift 4 dla konkretnego Viewcontrollera bez navigationViewController embedded wystarczy dodać to do pliku ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
 3
Author: Surjit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 05:27:26

Mogę zaproponować Ci prostszy sposób,

  1. po prostu wywołaj setNeedsStatusBarAppearanceUpdate w viewDidLoad, jak mówi Apple docs,

Wywołaj tę metodę, jeśli zmienią się atrybuty paska stanu kontrolera widoku, takie jak ukryty/Ukryty status lub styl. Jeśli wywołasz tę metodę w bloku animacji, zmiany zostaną animowane wraz z resztą bloku animacji.

  1. zaimplementuj preferredStatusBarStyle zwracając swój preferowany typ.
Działa mi w iOS 10.1.

Objective C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Swift

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}
Dziwię się, że nikt tego nie zauważył. W każdym razie enjoy :)
 2
Author: Bhaumik Desai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-17 15:31:47

Miałem z tym problem. Nie czułem się dobrze z globalną zmianą koloru paska stanu w widoku, a następnie zmiana go z powrotem na widok zniknęła, jak zaakceptowana odpowiedź. Wierz lub nie, możesz to uruchomić, nadpisując preferredStatusBarStyle na żądanym kontrolerze widoku. Po długim czasie to właśnie zrobiłem, aby to działało:

  1. Zmień wygląd paska stanu opartego na kontrolerze widoku w twoim info.plist na tak.
  2. teraz każdy kontroler widoku pełnoekranowego może Zmień styl paska stanu przez nadpisanie preferredStatusBarStyle.
  3. określam tryb pełnoekranowy, ponieważ nie będzie to działać dla kontrolerów widoku modalnego (nie pełnoekranowego), nie bez Ustawienia modal​Presentation​Captures​Status​Bar​Appearance na Yes that is.
  4. Również jeśli masz wbudowane Kontrolery widoku, jak na przykład w kontrolerze nawigacyjnym, zapyta najwyższy kontroler widoku o Styl paska stanu. Nadpisanie child​View​Controller​For​Status​Bar​Style i podanie wbudowanego kontrolera widoku powinno działać, ale nie dla mnie. Więc właśnie zwróciłem wbudowany wyświetl Kontrolery preferowany pasek stanu jako preferowany styl paska stanu. Coś takiego:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
    
 2
Author: John C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 02:01:29

Swift 3.0 Update

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
 1
Author: Jaseibert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-05 19:17:25

Kliknij na grupę plików pomocniczych(lewa strona od góry - Nazwa projektu). Przejdź do informacji. Kliknij na + gdzieś pomiędzy listami, jak poniżej Nazwa pakietu. I dodaj "wyświetl wygląd paska stanu opartego na kontrolerze" i ustaw go na nie. Następnie otwórz AppDelegate.swift i modyfikuj tak:

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

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

return true
}
To wszystko.
 0
Author: Goran Jakovljevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-09 08:23:27

Literalnie wdałem się w ten sam problem. Zajęło mi to ponad 4 godziny. Próbowałem wszystkich odpowiedzi podanych tutaj i najlepsze co dostałem, to dostać się do pozycji na białym pasku stanu. Ale pozostałe bity, takie jak pasek baterii i inne, były nadal czarne, bez względu na to, co zrobiłem: jeśli chodzi o zastosowanie wszystkich rozwiązań podanych w tym pytaniu. Postanowiłem więc odtworzyć moje kroki i dowiedziałem się, że pobrałem zależność CocoaPod, która zmieniała normalne funkcje Xcode i kody do Zmień kolory. Dla mnie był to" Kameleonframework". Więc radzę sprawdzić swoje zależności zainstalowane z CocoaPods usuwając najnowsze, jeśli zastosowałeś wszystkie rozwiązania i nie działają dla Ciebie.

 0
Author: Martin Q,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-10 02:20:20

Co u mnie działało, w Storyboardzie przejdź do kontrolera nawigacji, wybierz pasek nawigacji, kliknij na Inspektora atrybutów, a następnie zmień styl z domyślny na czarny. To jest to!

 0
Author: Amr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 22:52:12

Swift 3

W Twoim pliku AppDelegate wewnątrz metody func application

let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red
 -2
Author: Mohammed Tawfik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 07:52:03

Swift 4.0 Proszę użyć tego kodu w" didFinishLaunchingWithOptions launchOptions: "Appdelegate class

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 }
 -2
Author: Karthickkck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 03:13:05