2016-01-27 15 views
28

In un ViewController, che ho presentato modale, ho fatto questo:Come nascondere la barra di stato di un controller di visualizzazione singola in iOS 9?

override func prefersStatusBarHidden() -> Bool { 
    return true 
} 

Ciò usata per funzionare, ma non funziona più. Qual è il modo migliore per nascondere la barra di stato solo per questo controller di visualizzazione?

+0

controllare solo modo modo pianificato [questo ] (http://stackoverflow.com/q/19067899/3388012) –

+0

Funziona ancora bene.Se si desidera applicare la funzione a tutti i View Controller, considerare l'utilizzo dell'ereditarietà. – Tim

risposta

-1
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

e quando si desidera tornare in un VC separata:

UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None) 
+0

Questo è stato deprecato in iOS9. La risposta di Greg è corretta. – Benjamin

+0

Sì. Nessuno usa questo codice. Non serve più. Lasciando questo come riferimento per quello che era. – jasonnoahchoi

18

In iOS 9, Xcode 7, Swift 2.0, si torna a come era in precedenza.

override func prefersStatusBarHidden() -> Bool { 
     return true 
} 

Infatti Xcode vi dirà che

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

è stato deprecato e che si dovrebbe utilizzare il metodo prefersStatusBarHidden.

+2

Se il metodo prefersStatusBarHidden non fa nulla, aggiungi setNeedsStatusBarAppearanceUpdate() al metodo viewDidLoad o viewDidAppear. A seconda di cosa vuoi ottenere. – Benjamin

1

Per quelli ancora in difficoltà, il sotto funziona per iOS9.

Si aggiorna il rootViewController preferisceStatusBarHidden la funzione chiamando dal proprio figlio/nipote viewControllers. Funziona dove aggiungi childViewControllers direttamente al tuo rootViewController.

Non è necessario impostare nulla nel file info.plist, ma l'impostazione 'statusBarIsInitiallyHidden' funziona indipendentemente dal seguente.

In primo luogo, nella vostra RootViewController, aggiungere il seguente:

-(void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatusBarAppearance:) name:@"kStatusBarAppearance" object:nil]; 
} 
-(void)updateStatusBarAppearance:(NSNotification *)n { 
    statusBarIsHidden = [n.object boolValue]; 
    [self setNeedsStatusBarAppearanceUpdate]; 
} 
-(UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; //optional 
} 
-(BOOL)prefersStatusBarHidden{ 
    return statusBarIsHidden; 
} 

Poi, nel singolo controller della vista in cui si desidera nascondere la barra di stato, chiamare questo:

-(void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]]; 
} 
-(void)popSelf { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]]; 
} 
45

Per Swift 3 & Swift 4 è stato modificato per ignorare una variabile come questa:

override var prefersStatusBarHidden: Bool { 
    return true 
} 

Se si vuole "aggiornare" lo Stato una volta che è già visualizzato il controller della vista, è necessario chiamare:

setNeedsStatusBarAppearanceUpdate() 

prega di fare riferimento al documentation.

+2

non funziona nel mio caso. =. = –

15

Nel vostro UIViewController:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    UIApplication.shared.isStatusBarHidden = true 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    //It will show the status bar again after dismiss 
    UIApplication.shared.isStatusBarHidden = false 
} 

override var prefersStatusBarHidden: Bool { 
    return true 
} 
+2

Questo ha funzionato bene per me utilizzando Xcode 9 swift 4 .... –

+0

L'ho appena usato e ha funzionato perfettamente! Grazie per questo – Drewgost

2

È possibile utilizzare

override public func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    // hide status bar 
    dispatch_async(dispatch_get_main_queue(), { 
     if let window = UIApplication.sharedApplication().keyWindow { 
      window.windowLevel = UIWindowLevelStatusBar + 1 
     } 
    }) 

} 

override public func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    // Show status bar 
    dispatch_async(dispatch_get_main_queue(), { 
     if let window = UIApplication.sharedApplication().keyWindow { 
      window.windowLevel = UIWindowLevelNormal 
     } 
    }) 

} 
+1

Grazie mille per la tua preziosa risposta –

22

Per Swift 3 e Swift 4 quando vista sta per apparire

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    UIApplication.shared.isStatusBarHidden = true 
} 

quando vista goint a Dissapear

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    UIApplication.shared.isStatusBarHidden = false 
} 
+1

Questa è l'unica risposta che ha funzionato bene nel mio caso, perfetto! – XIII

+0

Credo che funzioni poiché hai incasinato la gerarchia ViewController e il sistema non chiama per preferireStatusBarHidden. –

1

di questo codice:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    UIApplication.shared.isStatusBarHidden = true 
} 

se questo codice non funziona, è necessario aggiungere questa chiave nella info.plist

barra di stato basati su controller di vista l'aspetto - NO

8

Per Swift 3,

override var prefersStatusBarHidden: Bool{ 
     return true 
    } 

e aggiungere viewDidLoad()

self.modalPresentationCapturesStatusBarAppearance = true 
0

Soluzione completa per iOS 11 e Swift 4, offrendo un controllo totale dal programma.

var statusBarHidden : Bool? 

override var prefersStatusBarHidden: Bool { 
    get { 
     if let status = statusBarHidden { return status } else { return false } 
    } 
    set(status) { 
     statusBarHidden = status 
     setNeedsStatusBarAppearanceUpdate() 
    } 
} 

Ora è possibile semplicemente mostrare o nascondere la barra di stato impostando la proprietà dal proprio codice. L'ho provato così:

@IBAction func Show(_ sender: Any) { 
    prefersStatusBarHidden = false 
} 

@IBAction func Hide(_ sender: Any) { 
    prefersStatusBarHidden = true 
} 

Funziona come un fascino.

0

sto usando Xcode Versione 9.2/Swift 3.2/iOS 11

ho ottenuto questo modulo di risposta BADCloud anche se non sono sicuro perché non ha funzionato per lui.

In ogni caso ha funzionato per me per un controller di visualizzazione specifico.

La differenza tra questa risposta e le risposte su questo caso è che nel mio info.plist quando inizialmente ho avuto View Controller-based barra di stato l'aspetto - NO con i metodi 2 barra di stato sotto di esso non ha funzionato, ma quando ho cambiato a funziona con entrambi.

Nella info.plist cambiamento: View controller-based barra di stato l'aspetto - SI enter image description here

Nel regolatore di vista che si desidera è cambiato in add:

override func viewDidLoad() { 
     super.viewDidLoad() 

     // add this in ViewDidLoad 
     setNeedsStatusBarAppearanceUpdate() 
} 

// add this underneath ViewDidLoad 
override var prefersStatusBarHidden: Bool { 
    return true 
} 
Problemi correlati