Come impostare lo stile della barra di stato in Swift 3


186

Sto usando Xcode 8.0 beta 4.

Nella versione precedente, UIViewController ha un metodo per impostare lo stile della barra di stato

public func preferredStatusBarStyle() -> UIStatusBarStyle

Tuttavia, ho scoperto che è stato cambiato in "Get ONLY varaiable" in Swift 3.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Come posso fornire lo stile da utilizzare nel mio UIViewController?


prova questo var preferitoStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Risposte:


485

[AGGIORNATO] Per Xcode 10+ e Swift 4.2+

Questo è il metodo preferito per iOS 7 e versioni successive

Nella tua applicazione Info.plist, imposta View controller-based status bar appearancesu YES.

Sostituisci preferredStatusBarStyle ( documenti Apple ) in ciascuno dei tuoi controller di visualizzazione. Per esempio:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Se stai preferredStatusBarStylerestituendo uno stile di barra di stato preferito diverso in base a qualcosa che cambia all'interno del tuo controller di visualizzazione (ad esempio, se la posizione di scorrimento o se l'immagine visualizzata è scura), allora vorrai chiamare setNeedsStatusBarAppearanceUpdate()quando lo stato cambia.

iOS prima della versione 7, metodo obsoleto

Apple l'ha deprecato , quindi verrà rimosso in futuro. Usa il metodo sopra in modo da non doverlo riscrivere quando viene rilasciata la prossima versione di iOS.

Se la tua applicazione supporterà Nella tua applicazione Info.plist, imposta View controller-based status bar appearancesu NO.

In appDelegate.swift, la didFinishLaunchingWithOptionsfunzione, aggiungi:

UIApplication.shared.statusBarStyle = .lightContent

Per il controller di navigazione

Se si utilizza un controller di navigazione e si desidera che la barra di stato stile preferito di ogni controller della vista da utilizzare e impostare View controller-based status bar appearanceper YESnei vostri dell'applicazioneinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

3
Per me va bene. Ho dimenticato di inserire prima la nuova impostazione in Info.plist.
falsecrypt

1
@LightMan uiapplication statusBarStyle non è obsoleto, l'ho usato in iOS 11 e funziona.
Sushobhit,

1
@Sushobhit setStatusBarStyle è stato deprecato in iOS 9, come utilizzato in questa risposta. Ma hai ancora UIApplication.statusBarStyle come proprietà di sola lettura.
LightMan,

1
Ci sono momenti in cui vuoi essere in grado di impostarlo a livello di programmazione a causa del colore di ciascuna vista.
Alejandro Cavazos,

9
Puoi anche rimuovere la linea in appDelegate.swift e andare su Target -> Generale -> Informazioni sulla distribuzione -> Stile barra di stato -> Leggero
Robert Veringa,

162

Ultimo aggiornamento (Xcode 10+ / Swift 4.2+)

Questo articolo viene lasciato intatto per chiunque sia disposto a comprendere la logica alla base dei diversi approcci presenti negli ultimi anni. Nel frattempo, a partire da Xcode 10, il primo approccio di Swift 4.2 è obsoleto e non è più supportato (ovvero non avrà effetto se si tenta di utilizzarlo). Si fa ancora riferimento alle tue informazioni per comprendere meglio il ragionamento dietro la Plist.infobandiera e la pratica di personalizzazione.

Chiarimento importante

È molto importante comprendere due approcci alla personalizzazione dell'aspetto della barra di stato. Sono diversi e non devono essere mescolati.

Primo approccio: un colore per l'intera app (DEPRECATO da iOS7)

In info.plist trovi o crei una chiave chiamata

View controller-based status bar appearance

e impostarlo su NO .

Cosa fa? Fondamentalmente stabilisce un'impostazione che dice che nell'applicazione, l'aspetto della barra di stato non è definito individualmente da ciascun controller di visualizzazione . Questo è molto importante da capire. Ciò significa che hai un'impostazione uniforme per l'intera app, per tutte le schermate. Esistono due impostazioni:, defaultche è testo nero su sfondo bianco, oppure lightContent, che è testo bianco su sfondo nero.

Per impostare uno di questi ( un'impostazione per tutte le schermate ):

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

In questo modo non sarà necessario ristabilire questa impostazione su ciascun controller di visualizzazione. Tuttavia, puoi sempre ricorrere a questo metodo per modificare volontariamente l'aspetto.

Secondo approccio: colore individuale per ciascun controller di visualizzazione

Questo è l'opposto. Per farlo funzionare, vai a info.plist e imposta

View controller-based status bar appearance

a

In questo modo, ogni volta che un nuovo controller di visualizzazione è aperto, lo stile della barra di stato viene impostato individualmente se si inserisce questa implementazione in ogni UIViewControlleristanza è necessario:

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

Hai lo stesso di prima, imposta lo stile scuro o chiaro per la barra di stato, individuale per ciascun controller di visualizzazione.

Questa proprietà viene recuperata da UIKit in due scenari:

  1. All'inizializzazione dello schermo, durante la preparazione dell'interfaccia utente.
  2. Dopo aver chiamato setNeedsStatusBarAppearanceUpdate()il codice.

In quest'ultimo caso, sei idoneo a manipolare l'aspetto della barra di stato con il seguente codice:

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

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

func toggleAppearance() {
   isDark.toggle()
}

Quindi, ogni volta che chiami toggleAppearance() , verrà attivato il cambio di stile della barra di stato.

Terzo approccio - Hack!

C'è un hack che consente di accedere direttamente alla barra di stato:

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
}

Perché hack? Se è necessario un colore della barra di stato diverso dal bianco o nero, si utilizza l'API non documentata. Ottieni statusBaroggetto usando KVC e ne imposta il colore di sfondo. L'oggetto ottenuto in questo modo è UIStatusBar, che deriva UIViewe quindi supporta naturalmente la backgroundColorproprietà. Questo è un modo sporco, non legale, ma finora è l'unico modo per impostare il colore personalizzato per la barra di stato (senza tener contoUINavigationBar dell'approccio, che consente di personalizzare del tutto l'aspetto della barra di stato +). Potrebbe indurre la tua app a essere respinta. Ma forse sei fortunato. E se lo sei, in determinate circostanze complesse (come la gerarchia dei controller di navigazione e visualizzazione nidificati), questo potrebbe essere praticamente l'unico, o almeno il modo meno problematico per personalizzare l'aspetto della barra di stato (ad esempio, per renderlo trasparente)

Xcode 10+, Swift 4.2

Non ci sono più alternative: lo sviluppatore dovrebbe consentire a ciascun controller di visualizzazione di definire l'aspetto della barra di stato, impostando il flag su (o omettendo questa azione, perché è SÌ per impostazione predefinita) e seguendo le istruzioni precedenti.


indennità

Soluzione basata su hack che potresti (anche se non incoraggiato a) utilizzare in circostanze complesse al fine di modificare volontariamente l'aspetto della barra di stato in qualsiasi fase. Dal punto di vista del colore, il seguente metodo di estensione fa esattamente ciò che avresti potuto fare con un approccio regolare. Puoi adattarlo alle tue esigenze.

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

2
Una volta che hai la barra di stato, puoi anche farlo: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); o utilizzare una chiave esistente per impostare qualsiasi proprietà disponibile per UIStatusBar ma non per UIView
Segna il

application.statusBarStyle = .lightContent questo approccio è generalmente dato che iOS9> Setter per 'statusBarStyle' è stato deprecato in iOS 9.0: Usa - [UIViewController preferitoStatusBarStyle] l'attesa per andare è per UIViewController
toxicsun

Questo è l'unico che funziona qui quando si cambia il tema del colore dell'app. Tuttavia, sembra che, una volta impostato, è necessario ripristinarlo quando si cambiano i controller di visualizzazione. Il metodo preferitoStatusBarStyle () viene ignorato da qui in poi (anche con l'impostazione corretta in info.plist).
automatico

2
Questa risposta è più descrittiva rispetto ad altre.
ViruMax,

2
La soluzione bonus è rotta in iOS 13.1
ViruMax,

130

Potresti provare a sovrascrivere il valore restituito, anziché impostarlo. Il metodo è dichiarato come {get}, quindi basta fornire un getter:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Se lo imposti in modo condizionale, dovrai chiamare in setNeedsStatusBarAppearanceUpdate()modo da animare la modifica quando sei pronto


2
Questo è un approccio migliore in quanto puoi scegliere prefersStatusBarHiddenper alcune delle tue opinioni. Se vai con UIApplication.shared.statusBarStylete ne rimarrai bloccato.
superarts.org,

105

Swift 3 e 4, iOS 10 e 11, Xcode 9 e 10
Per me, questo metodo non funziona:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

quando utilizzavo ogni controller di visualizzazione, ma funzionava:

  • Nel file info.list, aggiungi riga: View controller-based status bar appearancee imposta suNO

  • Avanti in delegazione dell'app:

    UIApplication.shared.statusBarStyle = .lightContent

Stavo provando solo dopo aver aggiunto il codice al delegato dell'app, ma l'impostazione del plist di informazioni mi è stata utile. Grazie
Akhilesh Sharma,

6
Il setter per "statusBarStyle" è stato deprecato in iOS 9.0: Usa - [UIViewController preferitoStatusBarStyle]
Reimond Hill il

33

Se vuoi cambiare il statusBarcolore del bianco in bianco, per tutte le viste contenute in a UINavigationController, aggiungi questo all'interno AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

Questo codice:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

non funziona per UIViewControllerscontenuto in a UINavigationController, perché il compilatore cerca il statusBarStyleof del UINavigationController, non il statusBarStyledelViewControllers contenuto da esso.

Spero che questo aiuti coloro che non sono riusciti con la risposta accettata!


Sì, grazie mille! Il controller di navigazione era una piccola sfumatura che molti non consideravano!
Alexis Candelaria,

26

Se si desidera modificare lo stile della barra di stato in qualsiasi momento dopo la visualizzazione della vista, è possibile utilizzare questo:

  • Nel file info.list aggiungi riga: visualizza l'aspetto della barra di stato basata sul controller e impostalo su

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
EIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G,

26

Xcode 10 o successivo

Testato in Swift 5

Nessun codice richiesto basta seguire i passaggi seguenti.

Se si desidera modificare la barra di stato nell'intera app.

  1. Selezionare Progetto da Navigatore progetto (pannello laterale sinistro).
  2. Seleziona target.
  3. Seleziona la scheda Generale.
  4. Trova informazioni sulla distribuzione.
  5. Cambia lo stile della barra di stato su Chiaro (per sfondo scuro "Chiaro" , Sfondo chiaro "Predefinito" )

Non dimenticare le modifiche a info.plist

  1. Seleziona la scheda Informazioni
  2. Aggiungi questa chiave nel tuo file plist "Visualizza aspetto barra di stato basata su controller" = NO

Esegui il tuo progetto e controllalo.

Il mio progetto in swift 5 e Xcode 10.2 e 11.0


Per Xcode 10 / Swift5 questa dovrebbe essere la risposta accettata. È necessario eseguire ENTRAMBE i passaggi affinché questo funzioni.
John Robi,

Perfetto. Grazie! Sono d'accordo che questa dovrebbe essere la risposta effettivamente accettata.
DungeonDev

Questa è la risposta perfetta 🤟🏻
nikhilgohil11

Questo funziona anche con xcode 11 con swift 5, grazie
Luis Santiago

25

È necessario aggiungere la chiave di seguito nel file Info.plist:

View controller-based status bar appearance con valore booleano impostato su NO

Nella tua classe delegata dell'app, nel didFinishLaunchingWithOptionsmetodo prima del ritorno.

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

modifica backgroundColore statusBarStylesecondo il requisito.


Bella soluzione, ma conta come usare un'API privata?
GoldenJoe,

Funziona bene, ma come posso cambiare il mio colore personalizzato?
iSrinivasan27,

@MohanSrinivasan invece di "UIColor.red" puoi specificare il tuo colore personalizzato.
Himanshu padia,

13

Puoi anche farlo nello storyboard

  1. Crea una nuova voce in info.plist "Visualizza aspetto barra di stato basata su controller" impostala su "SÌ".
  2. Vai allo storyboard e quindi seleziona il controller di navigazione che desideri modificare. Fai clic sulla barra di navigazione dalla sezione del profilo del documento Storyboard (riquadro sinistro sullo storyboard)
  3. Vai al pannello di destra e fai clic sulla sezione degli attributi
  4. Nella sezione Barra di navigazione vedrai lo stile. Seleziona lo stile che desideri (l'impostazione predefinita è per il nero e il nero è per il bianco)

Dovrai farlo per ogni controller di navigazione che hai. Tuttavia, qualsiasi vista sotto quel controller di navigazione cambierà lo stile / colore di tutte le barre di stato della vista con quella appena selezionata. Trovo questa opzione migliore perché puoi vedere i tuoi risultati all'istante e non devi aggiungere righe di codice extra in ogni controller di visualizzazione.

inserisci qui la descrizione dell'immagine

(Fatto con Xcode 8.3.3 in un progetto tutto Swift)


"Visualizza l'aspetto della barra di stato basata sul controller" dovrebbe essere impostato su "NO"
Willjay il

2
Modo molto pulito per impostare lo stile della barra di stato in base al contenuto di View Controller, che è il modo corretto invece di impostare View controller-based status bar appearance = NOe utilizzare solo lo stile chiaro o scuro nell'intera app. È un peccato che questo modo "Senza codice" funzioni solo in Navigation Controller, Apple dovrebbe prendere in considerazione l'aggiunta di un altro campo per impostare questa opzione all'interno di qualsiasi istanza di View Controller.
aldoram5,

12

Per le persone che desiderano modificare la barra di stato per tutti i controller di visualizzazione su: iOS 11, la soluzione Swfit 4/5 è piuttosto semplice.

1) Info.plist aggiungi:

Visualizza l'aspetto della barra di stato basata sul controller -> NO

2) Lato sinistro del progetto slect XCode> Target > Seleziona il tuo progetto> In Generale> Informazioni sulla distribuzione> Seleziona stile barra di stato: Luce

Se si desidera modificare la barra di stato solo per un viewcontroller , in viewDidLoad aggiungere:

2.1 ) Info.plist

Visualizza l'aspetto della barra di stato basata sul controller -> SÌ

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Cambio Objective-C (o reagisce nativo) dal delegato dell'app:

1) Info.plist aggiungi:

Visualizza l'aspetto della barra di stato basata sul controller -> NO

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

La modifica della barra di stato non funziona nel tentativo di eseguire push (controller di navigazione), ma solo nella presentazione di controller di visualizzazione modali.


8

Per prima cosa devi aggiungere una riga con chiave: View controller-based status bar appearancee valore NOal Info.plistfile. Successivamente, aggiungi 2 funzioni nel tuo controller solo a quel controller che avrà effetto:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

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

6

Swift 3

In Info.plist aggiungi una riga chiamata "Visualizza l'aspetto della barra di stato basata sul controller" e imposta il suo valore su No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

Sembra esserci un piccolo problema relativo al colore del testo della barra di stato quando si gestiscono le barre di navigazione.

Se vuoi che la voce .plist Visualizza l'aspetto della barra di stato basata sul controller sia impostata su YES, a volte non funzionerà quando hai una barra di navigazione colorata.

Per esempio:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

e

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

Il codice sopra non funzionerà anche se hai impostato quanto segue in AppDelegate:

UIApplication.shared.statusBarStyle = .lightContent

Per coloro che ancora lottano, a quanto pare giudica in qualche modo se la barra di stato deve essere chiara o scura dagli stili nella barra di navigazione. Quindi, sono riuscito a risolvere questo problema aggiungendo la seguente riga in viewWillAppear:

nav?.barStyle = UIBarStyle.black

Quando lo stile della barra è nero, allora ascolta la tua variabile sostituita. Spero che questo aiuti qualcuno :)


6

Da aggiungere alla grande risposta di @Krunal https://stackoverflow.com/a/49552326/4697535

Nel caso in cui si utilizzi un UINavigationController, preferredStatusBarStylenon avrà alcun effetto sul UIViewController.

Xcode 10 e Swift 4.

Imposta una personalizzazione UINavigationController

Esempio:

class LightNavigationController: UINavigationController {

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

Utilizzare un'estensione per una soluzione a livello di app:

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

5

Xcode 8.3.1, Swift 3.1

  1. Crea una nuova voce in info.plist "Visualizza aspetto barra di stato basata su controller" impostala su "NO".

  2. Apri AppDelegate.swift e aggiungi queste righe nel metodo "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent


5

Swift 4+

per il testo bianco della barra di stato:

navigationController.navigationBar.barStyle = .blackTranslucent

5

Ecco le Linee guida / istruzioni Apple sul cambio di stile della barra di stato.

Se si desidera impostare lo stile della barra di stato, il livello dell'applicazione è impostato UIViewControllerBasedStatusBarAppearancesu NOnel .plistfile. E in appdelegate> didFinishLaunchingWithOptionsaggiungi il seguente ine (programmaticamente puoi farlo dal delegato dell'app).

Obiettivo C

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

veloce

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

se vuoi impostare lo stile della barra di stato, a livello di controller, segui questi passaggi:

  1. Impostare UIViewControllerBasedStatusBarAppearancesu YESnel .plistfile, se è necessario impostare lo stile della barra di stato solo a livello di UIViewController.
  2. Nella viewDidLoad aggiungi funzione - setNeedsStatusBarAppearanceUpdate

  3. eseguire l'override diStatusBarStyle preferito nel controller di visualizzazione.

Obiettivo C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

veloce

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Impostare il valore di .plist in base al livello di impostazione dello stile della barra di stato.

inserisci qui la descrizione dell'immagine


4

Swift 4.0 Utilizza questo codice in "didFinishLaunchingWithOptions launchOptions:" Classe 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

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
}

'blackOpaque' non è disponibile: Usa UIStatusBarStyleLightContent
Makalele

3

Questo ha funzionato per me

Impostare l' View controller-based status baraspetto su NO in plist, quindi In ha UIViewController viewDidAppearappena aggiunto la seguente riga

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

setStatusBarStyle è obsoleto in iOS 9.
Lastmboy

3

veloce 3

se Visualizza l'aspetto della barra di stato basata sul controller = SÌ in Info.plist

quindi utilizzare questa estensione per tutti NavigationController

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

se non esiste UINavigationController e dispone solo di UIViewController, utilizzare il codice sottostante:

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

2
Non funziona per me. Ottengo gli errori "La proprietà non sovrascrive alcuna proprietà dalla sua superclasse" e "Getter per" favoriteStatusBarStyle "con il selettore Objective-C" favoriteStatusBarStyle "è in conflitto con la precedente dichiarazione con lo stesso selettore Objective-C".
Theo,

Grazie per questo, dopo 20 diversi tentativi e alcune combinazioni di elementi per provare questo è il modo di impostare il colore della barra di stato. Dovevo solo ricordare di chiamare setNeedsStatusBarAppearanceUpdate () quando volevo cambiare il colore mentre stavo aggiungendo in modalità notturna e il nero su nero semplicemente non funzionava.
Stuart P.

3

Swift 5

Per aggiungere ulteriori dettagli per la risposta di PRAVEEN su https://stackoverflow.com/a/40066798/2082851 , vorrei fornire la mia implementazione. Supporta la flessibilità di personalizzare la barra di stato di ciascun controller.

Nel complesso, creeremo un oggetto BaseViewControllerche gestirà la statusBarStyleproprietà in tutti i casi. Quando si crea un nuovo controller, renderlo come sottoclasse di questo controller di base.

Ogni volta che si desidera modificare l'aspetto dello stato, è sufficiente aggiornare questa proprietà. Lo stile della barra di stato verrà aggiornato immediatamente.

Implementazione

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

dimostrazione

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

inserisci qui la descrizione dell'immagine

2. UINavigationController

Per UINavigationController, è un caso speciale, che è possibile seguire entrambe le soluzioni:

Soluzione A: eseguire l'override con l'invio di messaggi

Poiché UINavigationController è NSObjecte eredita da ObjectiveC, i suoi metodi sono message dispatche puoi sostituirli.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Soluzione B: creare una UINavigationControllersottoclasse

Se hai già un'abitudine UINavigationController(che di solito ha bisogno di controllare più requisiti), questa è la soluzione migliore per te.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

È possibile utilizzare una proprietà bool denominata "shouldStatusBarDark" per attivare o disattivare il colore della barra di stato. E puoi anche aggiornare il suo valore per cambiare il colore della barra di stato durante lo scorrimento.

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

che cos'è la proprietà navView? grazie per aver condiviso la tua soluzione
medskill

1
@medskill navView è solo una barra di navigazione mimica aggiunta a livello di codice.
tiantong,

2

La maggior parte di queste risposte è la stessa cosa rielaborata, ma nessuna di esse in realtà si rivolge alla schermata di avvio per me quando utilizzo uno sfondo scuro.

Ho aggirato questo con il seguente nel mio info.plistche ha prodotto una barra di stato in stile chiaro.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

Se ricevi l'avviso: Il setter per 'statusBarStyle' è stato deprecato in iOS 9.0: Usa - [UIViewController preferitoStatusBarStyle] , quindi per impostare la barra di stato su chiaro o scuro usa il seguente codice:

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

Questo non farà cambiare la tua navBar ma indica semplicemente lo stile e quindi cambia la barra di stato di conseguenza.

NB. Devi assicurarti di aver impostato il tuo info.plist.

View controller-based status bar appearance to YES

2

Se stai utilizzando la presentazione modale devi impostare:

viewController.modalPresentationCapturesStatusBarAppearance = true

1

In iOS 13 puoi usare la .darkContent UIStatusBarStyleproprietà per visualizzare la barra di stato scura


1

Se non riesci ancora a modificare la base di stile della barra di stato sul metodo

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Puoi provare a usare questo metodo:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}

0

Per l'obiettivo C basta aggiungere questa riga nel metodo didFinishLaunch dell'applicazione

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
Questo è stato deprecato da iOS 9
MK_Dev il

0

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

}

3
Swift 9.3? Anno sbagliato, Marty
Unità iOS

Consiglio di stare alla larga dall'uso dell'API privata per "statusBar" di esaple. Apple apporta periodicamente modifiche alle API! E quando Apple modifica tale API, l'app potrebbe bloccarsi e non cambierà più la barra di stato. Questo ti farà cercare di nuovo un'altra soluzione.
Doci
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.