Modificarea culorii barei de stare pentru anumite ViewControllers folosind Swift în iOS8 (Programare, Swift, Uiviewcontroller, Ios8, Xcode6, Statusbar)

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

Utilizarea codului de mai sus în orice ViewController pentru a seta culoarea StatusBar la White pentru un viewcontroller specific nu funcționează în iOS8 pentru mine. Vreo sugestie? Folosind metoda UIApplication.sharedApplication, culoarea se schimbă după modificările necesare în Info.plist pentru întreaga aplicație.

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

Cum pot să fac modificări doar la culoarea barei de stare pentru unele modificări necesare și specifice ViewControllers?

37 răspunsuri
Anuj

După ce am citit toate sugestiile și am încercat câteva lucruri, am putut să fac acest lucru să funcționeze pentru viewcontrolleri specifici folosind următorii pași :

Primul pas:

Deschideți fișierul info.plist și introduceți o nouă cheie numită „Aspectul barei de stare bazat pe controlerul de vizualizare” la NU

Al doilea pas (Doar o explicație, nu este nevoie să implementați acest lucru):

În mod normal, punem următorul cod în metoda application(_:didFinishLaunchingWithOptions:)a aplicației AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

dar acest lucru afectează statusBarStyle tuturor ViewControllers.

Așadar, cum să facem ca acest lucru să funcționeze pentru anumite ViewControllers – Pasul final:

Deschideți fișierul viewcontroller în care doriți să modificați fișierul statusBarStyle și puneți următorul cod în viewWillAppear(), ,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

De asemenea, implementați și opțiunea viewWillDisappear() pentru acel viewController specific și introduceți următoarele linii de cod,

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
}

Acest pas va schimba mai întâi metoda statusBarStyle pentru viewcontrollerul specific și apoi îl va schimba înapoi în default atunci când viewcontrollerul specific dispare. Dacă nu se implementează viewWillDisappear() va schimba statusBarStyle permanent la noua valoare definită de UIStatusBarStyle.LightContent

Comentarii

  • Rețineți că dacă setați Status bar is initially hidden = YES în fișierul info.plist, „View controller-based status bar appearance = NO” va face ca bara de stare să devină ascunsă. –  > Por xi.lin.
  • În cazul în care se schimbă înapoi la UIStatusBarStyle.Default utilizând viewWillDisappear(), , ar trebui să folosiți viewWillAppear() pentru a-l inițializa, mai degrabă decât viewDidLoad()…., altfel, dacă reveniți la acea vizualizare fără ca aceasta să se reîncarce, nu veți vedea StatusBarStyle pe care îl așteptați. –  > Por William GP.
  • Pentru Swift 3: UIApplication.shared.statusBarStyle = .lightContent –  > Por ibrahimyilmaz.
  • Încă nu este clar cum se schimbă culoarea barei de stare –  > Por DoruChidean.
  • Băieți, este depreciat din iOS 9 –  > Por byJeevan.
BennyTheNerd

(Începând cu 25 august 2020)

Swift 5, , Swift 4.2, , Swift 4

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

Comentarii

  • Asigurați-vă că apelați super.viewWillAppear dacă copiați și lipiți acest cod –  > Por Stephen Silber.
  • Editat pentru a include super.viewWillAppear(). Mulțumim @StephenSilber pentru pont! –  > Por BennyTheNerd.
  • trebuie să suprascrieți PreferredStatusStyle sau nu va funcționa. mulțumesc pentru că ați semnalat acest lucru. +1 –  > Por Alix.
  • Folosind UIApplication.shared.statusBarStyle = .lightContent are ca rezultat acest avertisment de compilare: Setter for ‘statusBarStyle’ was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle] –  > Por airowe.
  • În Info.plist al aplicației dvs., setați „View controller-based status bar appearance” la YES –  > Por IvanPavliuk.
guillama

Soluție Swift 4.2 cu NavigationController

Primul pas:

Deschideți fișierul Info.plist și inserați o nouă cheie numită „Vizualizați aspectul barei de stare bazat pe controlerul de vizualizare” sau UIViewControllerBasedStatusBarAppearance la YES pentru a permite fiecărui VC să utilizeze propria proprietate de stare.

Al doilea pas

În fiecare VC, suprascrieți proprietatea preferredStatusBarStyle astfel :

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

Ultimul pas

Suprascrieți proprietatea preferredStatusBarStyle în clasa dumneavoastră personalizată NavigationController :

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
}

Comentarii

  • Aceasta este doar o modalitate de a obține rezultatul așteptat folosind Navigation Controller și controlorii proprii. De asemenea, ați putea face acest lucru și pentru prefersStatusBarBarHidden, așa cum am făcut eu pentru proiectul meu 🙂 –  > Por atereshkov.
chris_s

Am urmat acest tutorial și a funcționat pentru mine. Cu toate acestea, nu sunt sigur dacă există avertismente.

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

  • Deschideți fișierul info.plist și setațiUIViewControllerBasedStatusBarAppearance la false.
  • În prima funcție din AppDelegate.swift, , care conține didFinishLaunchingWithOptions, , setați culoarea pe care o doriți.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Actualizare Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent

Comentarii

  • cum este specific fiecărui controler de vizualizare –  > Por Yarneo.
  • Exact, acest lucru este pentru aplicația completă și nu aceasta este întrebarea. –  > Por Anuj.
  • Folosesc iOS 8 Swift și xCode 6.1.1.1 și doar urmând acești doi pași nu funcționează. De asemenea, trebuie să adăugați UIApplication.sharedApplication().statusBarHidden = false la AppDelegate.swift didFinishLauchingWithOptions –  > Por Ahmad Amin.
  • Acest lucru îl setează pentru întreaga aplicație. Pentru controlorii de vizualizare specifici, consultați primul răspuns. A funcționat pentru mine. –  > Por Akshar Patel.
  • Setterul pentru „statusBarStyle” a fost depreciat în iOS 9.0: Utilizați -[UIViewController preferredStatusBarStyle] – [UIViewController preferredStatusBarStyle] –  > Por J A S K I E R.
John R Perry

Există un miliard de răspunsuri aici, așa că m-am gândit de ce să nu adaug încă unul sub forma unui extensie (cu ajutorul lui @Cœur)

Swift 3

Extensie:

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

Implementare:

UIApplication.statusBarBackgroundColor = .blue

Comentarii

  • Vă rugăm să rețineți că această abordare ar putea fi considerată accesarea unui API privat și ar putea însemna că aplicația dvs. va fi respinsă de Apple. –  > Por JWhitey.
  • Sau, cel puțin, depinde de detaliile de implementare ale Apple și se poate întrerupe fără avertisment odată cu schimbările din iOS. –  > Por Chris Prince.
Nikita Khandelwal

În Info.plist trebuie să definiți aspectul barei de stare bazat pe controlerul de vizualizare la orice valoare.

Dacă o definiți DA, atunci ar trebui să suprascrieți funcția preferredStatusBarStyle în fiecare controler de vizualizare.

Dacă o definiți NU, atunci puteți seta stilul în AppDelegate utilizând

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

Comentarii

  • setStatusBarStyle a fost depășită în iOS 9.0 –  > Por Jeffrey Neo.
  • @Jeffrey_Neo Deși este adevărat, nu reușesc să fac înlocuirea să funcționeze. Ar fi util să văd comentariul dvs. ca răspuns cu un cod de lucru. –  > Por dumbledad.
A.G
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()
    }

}

Comentarii

  • folosind valueForKey("statusBar") este posibil să nu fie în conformitate cu orientările Apple –  > Por Cœur.
Chris Tsitsaris

Swift 3

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

Aceasta este soluția pentru setarea culorii de fundal a barei de stare pentru un controler de vizualizare specific.

Comentarii

  • UIView răspunde întotdeauna la backgroundColor în Swift. –  > Por Cœur.
A.J. Hernandez

SWIFT 2

Am reușit să schimb cu succes aspectul fundalului barei de stare adăugând următoarele în viewWillAppear:

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

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

codester

Implementați preferredStatusBarStyle așa cum ați menționat și apelați self.setNeedsStatusBarAppearanceUpdate() în ViewDidLoad și, de asemenea, în Info.plist setați UIViewControllerBasedStatusBarAppearance la YES (Este YES în mod implicit)

Nu este clar de ce nu funcționează.Trebuie să verific codul.O altă sugestie este să mergem cu codul de lucru în viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent și schimbați acest lucru la implicit atunci când vizualizați obțineți dispărut viewWillDisappear.

Comentarii

  • Doar punerea în aplicare a primei părți a răspunsului, a funcționat pentru mine. Cu toate acestea, nu am adăugat UIViewcontrollerBasedStatusBarAppearance în Info.plist. A funcționat în continuare. –  > Por Akshar Patel.
Giang

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

Comentarii

  • Am încercat toate soluțiile … acest lucru a funcționat doar pentru mine !!! Nu știu de ce 😀 –  > Por Khaled Hayek.
  • norocul sorții –  > Por Giang.
  • Setterul pentru „isStatusBarHidden” a fost depreciat în iOS 9.0: Folosiți -[UIViewController prefersStatusBarHidden] … –  > Por a tras...
wenghengcong

În situația mea, folosesc storyboard pentru a-mi organiza controlorii de vizualizare. vreau să schimb stilul tuturor barelor de stare.

Puteți vedea în imaginea de mai jos.

Stars Controlerul de vizualizare este un CPBaseNavigationController,și CPBaseNavigationController este o subclasă de UINavigationController.

Am încercat să fac următoarele setări:

  1. În AppDelegate.swift func didFinishLaunchingWithOptions,add

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

    dar nu are niciun efect.

  2. În StoryBoard,găsiți Base Tab BarController(imaginea de mai sus).select Attributes Inspector, , schimbați Sattus Bar atributul în Light Content.așa de rău, fără efect.

  1. Ultima dată am reușit.În controlerul meu de navigare personalizat CPBaseNavigationController, Adaugă funcția preferredStatusBarStyle

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

    Funcționează bine!

În plus,statusBarStyle depreciat în 9.0, puteți folosi -[UIViewController preferredStatusBarStyle].

theCrab

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

Jio

Funcționează pentru aplicația bazată pe navigație

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

Comentarii

  • În cazul în care pentru a adăuga acest cod specific, doar couldnt obține acest lucru pentru a lucra. –  > Por Anuj.
  • Îl puteți adăuga în fișierul delegat al aplicației în didFinishLaunchingWithOptions –  > Por Jio.
  • Nu ar fi mai bine să folosiți addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20) în loc să folosiți o lățime de 320 codată în mod dur? –  > Por Torsten Ojaperv.
  • Editat @TorstenOjaperv –  > Por Jio.
  • Cum se face cu swift 3.0 ? –  > Por YETI.
Anton Rusia

Totul este mult mai ușor în Swift 3.0 Xcode 8

Folosind codul de mai jos în fișierul App Delegate, după ce

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

introduceți acest lucru:

UINavigationBar.appearance().barStyle = .black

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

user6655984

Comentarii

  • Valorile roșu, verde și albastru sunt în intervalul de la 0 la 1. Trebuie să le împărțiți cu 255 sau nu va funcționa. –  > Por Makalele.
Surjit Singh

Swift 4 Pentru un ViewController specific fără navigationViewController încorporat, adăugați doar acest lucru la fișierul ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Comentarii

  • Dacă avem un controler de navigație încorporat, ce trebuie să faceți? –  > Por icekomo.
azemi

O altă modalitate foarte simplă de a face acest lucru să funcționeze este doar să creați o extensie a clasei UINavigationController.

Din moment ce suprascrierea clasei preferredStatusBarStyle: nu va funcționa DOAR DACĂ nu o facem în interiorul clasei UINavigationController.

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

Jawad Ali

(Începând cu 10 iunie 2020)

Swift 5 (Fără editare .Plist fișier)

Dacă utilizați Storyboard, , mergeți la NavigationController, , selectați navigationBar, , faceți clic pe Attributes Inspector, , apoi modificați style. dacă aveți nevoie de light content (bara de stare albă) setați-l orice, cu excepția default să spunem să setați stilul black Și dacă doriți dark content (bara de stare neagră) setați-l default.

Valoarea implicită (UIBarStyleDefault) are ca rezultat un prim-plan întunecat UIStatusBarStyleDefault de stare în prim-plan. Și UIBarStyleBlack va da un UIStatusBarStyleLightContent bară de stare.

Programatic

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Fără bara de navigare (Editați .Plist)

adăugați UIViewControllerBasedStatusBarAppearance / View controller-based status bar appearance la info.plist, , și setați valoarea este true.

Override la preferredStatusBarStyle din Controlerul dvs.

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

John C.

Am avut ceva probleme cu acesta. Nu m-am simțit foarte bine în legătură cu schimbarea globală a culorii barei de stare în vizualizare a apărut și apoi schimbarea ei înapoi în vizualizare a dispărut ca răspuns acceptat. Credeți sau nu, puteți face ca acest lucru să funcționeze prin suprascrierea preferredStatusBarStyle pe controlerul de vizualizare dorit. După mult timp, iată ce am făcut pentru a reuși să funcționeze:

  1. Schimbați aspectul barei de stare bazată pe controlerul de vizualizare în info.plist în YES.
  2. Acum, orice controler de vizualizare a ecranului complet poate schimba stilul barei de stare prin suprascrierea preferredStatusBarStyle.
  3. Am specificat full screen pentru că acest lucru nu va funcționa pentru controlorii de vizualizare modali (non-full screen), nu fără a seta modal​Presentation​Captures​Status​Bar​Appearance la Da, adică.
  4. De asemenea, dacă aveți controlori de vizualizare încorporați, cum ar fi, de exemplu, într-un controler de navigație, se va cere controlorului de vizualizare cel mai de sus stilul barei de stare. Suprascrierea child​View​Controller​For​Status​Bar​Style și trecerea controlerului de vizualizare încorporat ar trebui să funcționeze, dar în cazul meu nu a fost așa. Așa că am returnat pur și simplu bara de stare preferată a controlorilor de vizualizare încorporați ca stil preferat al barei de stare. Ceva de genul acesta:

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

Comentarii

  • Acest răspuns m-a ajutat! Am descoperit că, dintr-un motiv oarecare, controlerul meu de navigare (fiind prezentat modal) nu era implicit controlerului de vizualizare cel mai de sus pentru stilul barei de stare. Așa că a trebuit să subclasez UINavigationController și să suprascriu stilul child​View​Controller​For​Status​Bar​Style var acolo, returnând self.topViewController. –  > Por taber.
Jayprakash Dubey

Am setat o culoare specifică (în format RGB) folosind codul de mai jos în App Delegate fișier:

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

. . .
}

De asemenea, trebuie să adăugați cheia de mai jos în Info.plist fișier :

Vizualizați aspectul barei de stare bazat pe controlerul de vizualizare cu valoarea booleană setată la NU

Comentarii

  • Cu Siwft 3.0, cum se poate face acest lucru? –  > Por YETI.
Bhaumik Desai

Vă pot sugera o modalitate mai simplă,

  1. Doar sunați setNeedsStatusBarAppearanceUpdate în viewDidLoad, așa cum spune documentația Apple,

Apelați această metodă dacă se schimbă atributele barei de stare a controlerului de vizualizare, cum ar fi starea ascunsă/neascunse sau stilul. Dacă apelați această metodă în cadrul unui bloc de animație, modificările sunt animate împreună cu restul blocului de animație.

  1. Implementați preferredStatusBarStyle returnând tipul preferat.

Pentru mine a funcționat în iOS 10.1.

Obiectiv C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Swift

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Sunt surprins că nimeni nu a semnalat acest lucru. Oricum, bucurați-vă 🙂

Mahmoud

În Swift 5 sau xcode 11 și mai târziu setați (Vizualizează aspectul barei de stare bazat pe controlerul de vizualizare) cheie în info.plist ca NOThen du-te la țintă proiect și selectați general, Set stilul barei de stare la întuneric sau lumină

Amr

Ceea ce a funcționat la mine, în Storyboard, mergeți la Controlerul de navigare, selectați bara de navigare, faceți clic pe Inspectorul de atribute, apoi schimbați stilul de la implicit la negru. Asta e tot!

Ridho Octanio

În Swift 4 sau 4.2

Puteți adăuga pe vc dvs.

preferredStatusBarStyle

și setați valoarea de returnare la

.lightContent sau .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

Jaseibert

Actualizare Swift 3.0

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

Erik Uecke

SWIFT 4.2Hei, am vrut să împărtășesc o soluție, care a funcționat pentru mine, pe care am obținut-o dintr-un articol excelent pe acest subiect elusiv de Graig Grummitt.

Pasul 1Așa cum au menționat și alții ADAUGĂ mai jos la PLISTUL tău

View controller-based status bar appearance YES

Pasul 2 în RootViewcontroller adăugați mai jos

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
    }

Când actualizați oricare dintre proprietăți statusBarHidden sau vcStatusBarStyle se va apela setNeedsStatusBarAppearanceUpdate() și va actualiza bara de stare cu noile valori pentru oricare dintre ele prefersStatusBarHidden fie preferredStatusBarStyle. În situația mea, a trebuit să actualizez aceste proprietăți pentru viewcontrollerul container, care era părintele viewcontrollerului copil vizibil. Am făcut acest lucru folosind o metodă delegată simplă.

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

Bineînțeles, atunci când instanțiați childViewController(Visible VC) nu uitați să setați MainViewcontroller(Container VC) ca delegat al acestuia. Eu o fac uneori. 🙂

childViewController.delegate = self

Apoi, în childViewController am apelat doar metoda delegată atunci când a fost nevoie pentru a actualiza bara de stare.

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

După cum s-a menționat mai sus, Graig Grummitt intră în mai multe detalii despre această soluție și, de asemenea, lucrează și cu UINavigationControllers. Link aici: Misteriosul caz al barei de stare

Tung Fam

Culoare personalizată pentru bara de stare (iOS11+, Swift4+)

Dacă sunteți în căutarea unei soluții cum să schimbați bara de stare în culoarea dvs. personalizată, aceasta este soluția de lucru.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue

Goran Jakovljevic

Faceți clic pe grupul Supporting Files(partea stângă sus – numele proiectului dvs.). Navigați la Info. Faceți clic pe + undeva între liste, ca sub numele pachetului. Și adăugați „View controller-based status bar appearence” (Apariție bară de stare bazată pe controlerul de vizualizare) și setați-o la NO.Apoi deschideți AppDelegate.swift și modificați-o astfel:

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

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

return true
}

Asta este.

Comentarii

  • Ați citit greșit întrebarea. Am întrebat despre cum se poate schimba StatusBarStyle pentru anumite viewcontrolleri, nu pentru întreaga aplicație. –  > Por Anuj.
  • Verificați răspunsul meu de mai jos @ Anuj –  > Por theCrab.
Fabio

Pentru Xcode 10 puteți crea o clasă și puneți-o înainte de clasa viewController, puteți apela această clasă în toate controlorii de vizualizare este nevoie de o bară de stare cu conținut ușor…

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

Acum schimbați clasa viewController în:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Și asta e tot…

Gangireddy Rami Reddy

Funcționează pentru navigare bazată pe navigare pentru un anumit controler de vizualizare în swift4

   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)

hesham ghalaab

AVERTISMENT


Setter pentru „statusBarStyle” a fost depreciat în iOS 9.0: Utilizați -[UIViewController preferredStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

așa că soluția mea a fost ca aceasta: realizarea unei extensii din controlerul de navigare:

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

        return .default
    }
}

și dacă aveți un viewController care va avea un alt stil decât cel al aplicației, puteți face acest lucru

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

să spunem că stilul de stare al aplicației este .default și doriți ca acest ecran să fie .lightContentdeci barStyle va lua stilul .lightContent ca valoare implicită, acest lucru va schimba stilul barei de stare în lightContent, iar apoi asigurați-vă că atunci când viewWillDisappear schimbați din nou barStyle în stilul barei de stare a aplicației, care în cazul nostru este .default .

acest lucru funcționează pentru mine

fzh

Există două situații:

1.show bara de navigare

1) adăugați1UIViewControllerBasedStatusBarAppearance / View controller-based status bar appearance la pagina dvs. info.plist, , și setați valoarea este true.

2) Suprascrieți proprietatea preferredStatusBarStyle în clasa dvs. personalizată NavigationController : (de la @guillama)

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
    }

3) suprascrieți preferredStatusBarStyle în controlerul dvs. de vizualizare specific:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

2.hidden navigation bar

1) idem

2) nu aveți nevoie de al doilea pas de mai sus, ar trebui să implementați direct al treilea pas.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Agisight

Eu folosesc acest mod în Swift 5, Swift 4.2.

Adăugați următoarele valori la Info.plist:

UIViewControllerBasedStatusBarAppearance = YES

sau

UIViewControllerBasedStatusBarAppearance = NO (pentru a vedea modificările)

UIStatusBarBarHidden = NO

UIStatusBarStyle = UIStatusBarStyleDefault (sau setat la UIStatusBarStyleLightContent dacă doriți să vedeți texte ușoare în bara de stare la lansare)

Apoi, plasați codul de mai jos în controlorii de vizualizare specifici în care doriți să vedeți conținutul luminos (pentru a vedea texte întunecate, setați preferredStatusBarStyle la .darkContent).

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

override func viewDidLoad() {
    super.viewDidLoad()

    if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = .sunflowerYellow
    }
}

Comentarii

  • Cu acest lucru în viewDidLoad „if let statusBar: UIView = UIApplication.shared.value(forKey: „statusBar”) as? UIView { statusBar.backgroundColor = .sunflowerYellow }” programul se blochează –  > Por Alex Giatrakis.
Kaiusee

Începând cu octombrie 2020, Swift 5, Xcode 12

Dacă doriți să o setați pentru toți controlorii de vizualizare din aplicație. și dacă aplicația dvs. are un controler de navigare.

Puteți face acest lucru în fișierul plist după cum urmează:

Mohammed Tawfik

Swift 3

În fișierul dvs. AppDelegate în interiorul fișierului func application metoda

let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red

Ahmed Ashraf Butt

dacă cineva dorește să schimbe culoarea bateriei și a textului din bara de stare ca în imaginea de mai jos:

puteți utiliza următorul cod în clasa appdelegate.

UINavigationBar.appearance().barTintColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]

Karthick C

Swift 4.0 Vă rugăm să utilizați acest cod în „didFinishLaunchingWithOptions launchOptions:” Clasa 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 }

iOS 13

 var statusBarView: UIView = UIView()
        if #available(iOS 13.0, *) {
            let tag:UInt64 = 38482458385
            if let statusBar = UIApplication.shared.keyWindow?.viewWithTag(Int(tag)) {
                statusBar.backgroundColor = UIColor.red
                statusBarView = statusBar
            } else {
                let statusBar = UIView(frame: UIApplication.shared.statusBarFrame)
                statusBar.tag = Int(tag)
                UIApplication.shared.keyWindow?.addSubview(statusBar)
                statusBarView = statusBar
            }
        } else {
            statusBarView = (UIApplication.shared.value(forKey: "statusBar") as? UIView)!
            if statusBarView.responds(to: #selector(setter: UIView.backgroundColor)){
                statusBarView.backgroundColor = UIColor.red
            }
        }