2015-09-19 7 views
47

Sto tentando di cambiare lo stile della mia barra di stato per .Light ma il codice precedente ho implementato in rapida 1.2 sembra non funzionare più .. ecco il codice:come cambio correttamente lo stile della barra di stato in swift 2/iOS 9?

override func viewDidLoad() { 
     super.viewDidLoad() 

     UIApplication.sharedApplication().statusBarStyle = .LightContent 

    } 

ora ho la mia impostazione View controller-based status bar appearance info.plist a SÌ, e leggendo il documento UIKit, questo annullerà tutte le modifiche statusBarStyle e lo manterrà al valore predefinito. Tuttavia quando cambio l'impostazione su "NO" e cambio lo statusBarStyle, ottengo questo <Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable nel mio debugger. Quindi questo è un bug in Xcode? perché per modificare lo stile della barra di stato è necessario modificare l'impostazione info.plist su NO, ma quando ciò accade .. errore

risposta

44

Ho sempre fatto così.

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    //Changing Status Bar 
    override func preferredStatusBarStyle() -> UIStatusBarStyle { 

     //LightContent 
     return UIStatusBarStyle.LightContent 

     //Default 
     //return UIStatusBarStyle.Default 
    } 
} 

Funziona in qualsiasi versione 2.x rapida. È necessario impostare View controller-based status bar appearance nel file Info.plist su YES.

+4

Si prega inoltre di fare in modo, se si utilizza questo metodo di impostare il flag nel file info.plist per rendere il flag della barra di stato basato sul controller di visualizzazione su yes –

+5

@ real19 Yup, ha funzionato per me. Solo per chiarire le cose per i principianti. Per fare ciò, aggiungi una proprietà nel file Info.plist, chiamata "Visualizza aspetto barra di stato basata su controller" (Xcode completerà automaticamente il nome della proprietà e riconoscerà automaticamente che è un valore booleano) e imposta questa proprietà su "SÌ". Ciò renderà la barra di stato un effetto "contenuto di luce". –

+1

e se volessi cambiarlo manualmente o basarmi sul contesto? Ho una notifica a discesa e quando appare questo menu a tendina, voglio cambiare il colore della barra di stato. È possibile? – TomSawyer

4

Sembra che si tratti di un bug in Xcode 7.0. Sto anche ricevendo l'errore Error>: CGContextSaveGState: invalid context 0x0. quando si imposta View controller-based status bar appearance

Per ora sto solo sovrascrivendo il colore della barra di stato in ogni controller di visualizzazione.

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

Questo non è di aiuto se il contenuto viene modificato in modo tale da richiedere la modifica della barra di stato per lo stesso controller di visualizzazione a livello di codice. –

7

È comunque possibile utilizzare preferredStatusBarStyle nel controller della vista:

passo 1: nel info.plist impostare ViewControllerBasedStatusBarAppearance su YES. fase 2: aggiungere questo codice al ViewController che desideri modificare:

override func preferredStatusBarStyle() -> UIStatusBarStyle { 

    return UIStatusBarStyle.LightContent 
} 

*** Suggerimento: Sembra funzionare solo al di fuori delle viewDidLoad() funzioni, didReceiveMemoryWarning().

5

Puoi anche aggiungere questo in AppDelegate. Questa opzione è migliore se vuoi cambiarla per ogni ViewController nell'app e non devi renderla diversa per ogni altro VC.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    application.statusBarStyle = UIStatusBarStyle.LightContent 
    // instead of 
    // UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: false) 
    // which gives warning about deprecation in iOS 9 

    return true 
} 
72

Apple ha aggiunto la possibilità di modificare lo stile della barra di stato nelle informazioni di implementazione. Scegli semplicemente "Luce". ScreenShot of Xcode

impostare anche View controller-based status bar appearance chiave per NO nel Info.plist

info plist

+3

Questo non è cambiato per me, XCode 7, iOS 9.2 –

+13

Si noti che questo ** funziona ** solo se si imposta la chiave di aspetto 'Visualizza barra di stato basata su controller 'su' NO' in 'Info.plist'. – Aleksander

+0

Se si seleziona Luce in 'Stato barra di stato' nelle impostazioni del progetto, allora dovrebbe aggiungere automaticamente questa chiave nel file Info.plist. –

6

Il cambiamento nelle informazioni di distribuzione funziona, ma, nonostante - è necessario aggiungere la chiave 'Visualizza stato basato su controller bar aspetto' a plist file impostandolo su NO.

+0

Grazie. Funziona. – Kit

4

È possibile scegliere "light" nelle informazioni di implementazione, ma è necessario aggiungere anche "Aspetto della barra di stato di visualizzazione del controller" e impostarlo su NO.

0

Se si desidera modificarlo di volta in volta all'interno dell'app, è possibile utilizzare le sostituzioni preferredStatusBarStyle() come indicato in precedenza.

Assicurati di chiamare anche setNeedsStatusBarAppearanceUpdate() dopo aver chiamato preferredStatusBarStyle(), per informare IOS a riguardo.

4

Qui provare questo potrebbe aiutarti

primo file info.plist goto e aggiungere questo "Vedi controller-based barra di stato l'aspetto" come chiave e impostare il valore di NO

qui di seguito illustrato in l'immagine enter image description here

dopo questo venire a file di AppDelegate.swift e passato questo UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent riga di codice nel

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool{ 
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent 
return true 
} 

come questo

+0

non funziona quando c'è la barra di navigazione. funziona solo senza di esso –

+0

@DoughnutMan fa 'navigationController? .navigationBar.barStyle = .Default' lavoro per te? –

+0

@Beau Nouvelle navigationController? .navigationBar.barStyle = .Default questo cambierà lo stile della barra di navigazione e non lo stile della barra di stato. –

4

per SWIFT 3 di override l'uso variabile preferredStatusBarStyle questo:

override var preferredStatusBarStyle: UIStatusBarStyle{ 
    return .lightContent 
} 
+0

Sì, ma non funziona sempre e non so perché –

+0

@AlessandroLucarini Puoi provare questo e segnalare? 'navigationController? .navigationBar.barStyle =.Default' La risposta sopra può funzionare quando il VC non è incorporato in uno stack di navigazione. –

+0

@BeauNouvelle ho risolto l'estensione di NavigationController sovrascrivendo 'childViewControllerForStatusBarStyle' quando il mio controller è incorporato in un controller di navigazione e impostando' modalPresentationCapturesStatusBarAppearance' quando vc è presentato in modo modale. –

7

Swift 3 basta aggiungere View controller-based status bar appearance con valore NO per info.plist e quindi aggiungere al ViewController dove si vuole:

UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent 
+0

in iOS 10, ignorare preferredStatusBarStyle non sembra essere sufficiente. È necessario essere dichiarato utilizzando UIApplication.shared.statusBarStyle –

2

Le risposte esistenti sono grandiose, ma ora è leggermente diversa con i nuovi aggiornamenti!

override var ora invece di override func per chiunque confuso - il succo del discorso è sempre lo stesso ed è ancora bisogno di cambiare il vostro 'Info.plist':

override var preferredStatusBarStyle: UIStatusBarStyle 
{  
    //LightContent 
    return UIStatusBarStyle.lightContent 

    //Default 
    //return UIStatusBarStyle.default 
} 
Problemi correlati