Come posso nascondere la barra di stato in un'app Swift per iOS?


201

Vorrei rimuovere la barra di stato nella parte superiore dello schermo.

Questo non funziona:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

Ho anche provato:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}

Risposte:


449

Dovresti davvero implementare prefersStatusBarHidden sui tuoi controller di visualizzazione:

Swift 3 e versioni successive

override var prefersStatusBarHidden: Bool {
    return true
}

4
Penso che l'intenzione di Jay sia quella di nascondere la barra di stato per l'app completa. Ecco perché avrebbe scritto funzionalità nascondi nell'applicazione didFinishLaunchingWithOptions. Come nascondere la barra di stato per l'app completa?
Satyam,

@Satyam ha un buon punto, sarebbe bello rimuoverlo nell'intera applicazione. Esiste un approccio per implementarlo attraverso l'ereditarietà? O tramite l'estensione del protocollo?
Dan Beaulieu,

3
@DanBeaulieu Penso che attraverso l'eredità sarebbe un'ottima soluzione. Crea una sottoclasse UIViewController in cui la barra nascosta è impostata su true e quindi eredita tutte le sottoclassi da quella. Un altro approccio potrebbe essere l'utilizzo di Swizzling
CrisiGriega,

1
Il codice Swift 3 non funzionava, vedi: stackoverflow.com/a/38902285/129202
Jonny

1
In questo metodo si verifica un errore: quando si desidera eseguire un seguito, la vista del genitore del controllo della vista corrente diminuisce di circa 20 px
iman kazemayni

99
  1. Vai al file Info.plist
  2. Passa il mouse su una di quelle linee e apparirà un pulsante (+) e (-).
  3. Fare clic sul pulsante più per aggiungere una nuova chiave Digitare inizia con la V maiuscola e automaticamente la prima scelta sarà Visualizza l'aspetto della barra di stato basata sul controller.
  4. Aggiungilo come CHIAVE.
  5. Impostare VALUE su "NO"
  6. Vai a AppDelegate.swift
  7. Aggiungi il codice, all'interno del metodo

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

FATTO! Esegui la tua app e non più barra di stato!


1
All'inizio ho pensato che questa soluzione funzionasse bene, ma poi ho notato che causa un errore che ho dovuto eseguire il debug con CG_CONTEXT_SHOW_BACKTRACE. È tornato indietro con l'aggiunta di "Visualizza l'aspetto della barra di stato basata sul controller"
Sean,

Ha funzionato bene per me in IOS 9 2.2
uplearnedu.com

1
Ha funzionato per il simulatore iOS 10.1. Grazie, @nycdanie.
Girolamo

7
Oltre a impostare "Visualizza aspetto barra di stato basata su controller" su NO, aggiungere anche "Barra di stato inizialmente nascosta" impostata su "SÌ". Quindi non è necessario aggiungere codice nel controller di visualizzazione e la barra di stato verrà nascosta nell'intera applicazione. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF

1
@tylerSF Funziona alla grande! Dovresti aggiungere questo come risposta :)
Pétur Ingi Egilsson,

72

Swift 3

Nel Info.plistsetView controller-based status bar appearance aNO

E chiama UIApplication.shared.isStatusBarHidden = true


1
Se è impostato su Sì, questo è l'unico modo in cui funzionerà.
farzadshbfn,

@farzadshbfn non è giusto. Come detto e testato da me funziona con NO booleano.
Codetard

43

Se si desidera nascondere e ripristinare la barra di stato al tocco del pulsante , mentre al momento della presentazione e della chiusura del menu a scorrimento , i popup ecc., Puoi utilizzare questo metodo: -

Per nascondere la barra di stato: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Per ripristinare la barra di stato: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

Questo è più di un trucco. Non vorrei immischiarmi con la finestra in questo modo ... specialmente se esiste già una soluzione. Vorrei incoraggiare gli sviluppatori a sovrascrivere la prefersStatusBarHiddenproprietà come ciò che è già stato menzionato.
Stephen Paul,

2
questo può essere usato se vogliamo nascondere e ripristinare momentaneamente la barra di stato ... nella mia app, quando il menu a scorrimento viene dal lato sinistro, devo nascondere la barra di stato. e quando il menu scompare, dobbiamo riportare la barra di stato, come nell'app iOS di Gmail .. quindi in quel tipo di scenari, possiamo usarlo.
Vincent Joy,

3
Si tratta di un hack, e non vorrei immischiarmi con esso, ma fa il lavoro per il momento. Un po 'come tutti voi dite. Il problema prefersStatusBarHiddenè che le viste legate alla barra di stato mediante vincoli e anche le barre di navigazione si sposteranno in modo errato se si attiva / disattiva la barra di stato mediante prefersStatusBarHidden . Per il momento solo questa risposta sembra aggirare il problema.
Jonny,

Totalmente d'accordo con @Jonny, non mi piace neanche questa soluzione, ma come ha detto, l'override prefersStatusBarHiddenrovinerà il tuo vincolo. Finora questo funziona. Comunque sto usando un piccolo wrapper per evitare di usare i singoli, puoi trovarlo qui
rgkobashi

34

se preferisci un approccio visivo piuttosto che codificarlo, usa questo metodo: nel tuo info.plist

inserisci qui la descrizione dell'immagine aggiungi semplicemente View controller-based status bar appearanceaNO

e Status bar is initially hiddencomeYES


Questa è la risposta canonica nel 2018
ChrisH,

28
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}

28

Aggiornamento per iOS 10 / Swift 3.0

Non più una funzione, ora una proprietà ...

override var prefersStatusBarHidden: Bool {
    return true
}

Sai come impostarlo in tutta l'app, al momento devo inserirlo in ogni viewController
William T.

Prova il menu Trova, quindi Trova e sostituisci nel progetto? Forse? Ma quel dannato aiuto extra con il nidificato si ottiene ... hmmm .... non so. buona domanda!
atlwx

prefersStatusBarHidden non è mai stato chiamato
Bagusflyer il

6
Non hai bisogno del get { } se non ne hai uno set, basta scriverereturn true
Daniel

16

in Swift 3.x:

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

Questo è deprecato in iOS 9.0
Georgios

16

Vai al tuo Info.plist e aggiungi due chiavi:

Vai al tuo Info.plist e aggiungi due chiavi:


12

Quindi il problema qui in realtà non ha nulla a che fare con Swift ma solo come l'aspetto della barra di stato viene gestito da iOS 7.

Per impostazione predefinita, i controller di visualizzazione controllano individualmente l'aspetto della barra di stato quando sono sullo schermo. Se si desidera utilizzare questo metodo di controllo della barra di stato, è possibile sovrascrivere i seguenti metodi per qualsiasi controller di vista per cui si desidera modificare l'aspetto:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation ,

Nel tuo caso, ti limiteresti a implementare prefersStatusBarHidden e ritornitrue .

L'altro modo sarebbe controllare l'aspetto della barra di stato a livello di applicazione. Questo sembra essere ciò che stai effettivamente cercando di fare (impostandoapplication.statusBarHidden ).

Per farlo funzionare, devi aprire il Info.plistfile della tua app, aggiungere la chiave UIViewControllerBasedStatusBarAppearancee dargli un valore di NO.


1
Penso che intendi return true per prefersStatusBarHidden. NO appartiene a ObjC ed è comunque il valore bool errato.
HenryRoot, due

@HenryRoot Due non nei file .plist. Lì usiamo ancora SÌ / NO
Alex Salom il

8

In realtà l'ho capito da solo. Aggiungerò la mia soluzione come un'altra opzione.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

Un buon approccio per mantenere le cose pulite e modulari
Roger Fernandez Guri,

2
Non posso implementarlo. Forse è perché ora uso Swift 1.2. Ricevo l'errore: "Il metodo 'prefersStatusBarHidden ()' con il selettore Objective-C 'prefersStatusBarHidden' è in conflitto con la precedente dichiarazione con lo stesso selettore Objective-C". Ho anche aggiunto la parola chiave override all'inizio, ma ottengo sempre lo stesso errore.
Andrej,

Devi aggiungere questo ad ogni vista?
Sean,

Non funziona in Swift 2, mostra l'errore come spiegato sopra @Andrej.
Nagendra Rao,

4

Va bene, quindi questo diventa un problema per me dato che iOS 9 non supporta nessuno sopra il metodo che la gente ha menzionato qui come UIApplication.sharedApplication().statusBarHidden = true o

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

e

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

funziona ma non fornisce una soluzione programmabile in cui posso cambiare a una condizione. ( statusBarHidden = truee statusBarHidden = falsecome abbiamo fatto prima).

Soluzione a questa follia:

Aggiungendo ai mi prefersStatusBarHidden()piace di seguito puoi controllare UIViewControllerBasedStatusBarAppearancea livello di codice nascondere e mostrare la barra di stato senza aggiungere impostazioni alla tua info.plist :

var showStatusBar = true

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

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

quindi usalo in questo modo nel tuo codice:

//Hide Status Bar
showStatusBar(false)

O

//Show Status Bar
showStatusBar(true)

1
Chiamare ha prefersStatusBarHiddenun senso? Immagino che intendi self.setNeedsStatusBarAppearanceUpdate()dopo aver showStatusBarassegnato
Leo

È davvero una follia, vero? Che API pietosa è questa, ed è stata per così tanto tempo. Questo genere di cose rende lo sviluppo di iOS incredibilmente frustrante a volte.
Womble,

@Womble, sì, e può anche diventare piuttosto complicato. Speriamo che Swift 3.0 abbia una libreria migliore e supporti poiché, a prima vista, cambierà molto da Swift 2.3 ... rompendo le cose.
CodeOverRide,

Invece di chiamare prefersStatusBarHidden dal tuo metodo, potresti chiamare setNeedsStatusBarAppearanceUpdate
Oscar

4

Solo per aggiungere, quando si esegue l' override del prefersStatusBarHiddenmetodo o della variabile, View controller-based status bar appearancein Info.plist deve essere SÌ, altrimenti l'override non avrà alcun effetto


4

in Swift 4.2 ora è una proprietà.

override var prefersStatusBarHidden: Bool {
    return true
}

3

Nel mio caso, stavo cercando la barra di stato da nascondere / mostrare su richiesta; anziché solo quando la vista viene caricata o scompare.

rapido 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()

3

Swift 5: nel controller della vista principale o nel controller di navigazione principale, se hai,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

E "Visualizza aspetto barra di stato basata sul controller" in plist deve essere SÌ, altrimenti il ​​codice sopra riportato non verrà chiamato.

Se vuoi nascondere la barra di stato all'avvio dell'app, "La barra di stato è inizialmente nascosta" in plist deve essere SÌ. Ciò può impedire che l'immagine di avvio venga distorta quando viene visualizzata una barra blu aggiuntiva nella parte superiore dello schermo.


2

Una soluzione che funziona per me; se si desidera nascondere la barra di stato su un controller di visualizzazione specifico durante il caricamento:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

Attenzione: se imposti il ​​tasto " Visualizza aspetto barra di stato basata su controller " su " NO " nella tua info.plist il codice sopra non funziona. È necessario impostare la chiave su " " o rimuoverla da info.plist


Non è possibile ignorare la proprietà hideStatusBar poiché è una proprietà memorizzata! puoi comunque scegliere un altro nome e l'animazione funzionerà.
XcodeNOOB

2

Nel tuo progetto Generale-> Informazioni sulla distribuzione-> Stile barra di stato seleziona il segno di spunta su Nascondi barra di stato Nota: - nasconde la barra di stato in tutta l'applicazione


1
Questo funziona per me (iOS 12), dove le risposte plist no.
tre

2

Per Swift 4+ prova il seguente codice (testato su Swift 4.0, 4.1 - IOS 10, 11):

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}

2

Swift 5+

Nel mio caso, devo aggiornare la barra di stato nascosta in base ad alcune condizioni.

Per questo motivo, creo un controller di base BaseViewControllerche contiene nuove proprietà hideStatusBar.

Altri controller di visualizzazione sono sottoclassi di questo controller di base. Infine, quando voglio aggiornare il comportamento della barra di stato, ho solo bisogno di cambiare questo hideStatusBarvalore.

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Come usare

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

dimostrazione

Ecco una demo, sto usando UIView.animate(...)per rendere la transizione più fluida.

inserisci qui la descrizione dell'immagine


1

Sto usando Xcode 8.1 (8B62) con un target di distribuzione impostato su 10.1 e non ho avuto molta fortuna con le opzioni di override sopra menzionate. Tuttavia, il controllo dell'opzione "Nascondi barra di stato" nelle Informazioni sulla distribuzione mi ha aiutato.

Progetto> Generale

Spero che aiuti.


1

Se si presenta il controller di visualizzazione in modo modale, provare

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

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

4
Quando rispondi a una domanda, spiega la tua risposta, lo snippet di codice non è una risposta corretta.
LazerBanana,

0

Puoi usare questo codice nel tuo ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

Grazie per la risposta, ti interessa elaborare un po 'di più. Dove deve aggiungere esattamente la riga di codice e perché dovrebbe funzionare? Vedi la sezione Come posso scrivere una buona risposta .
9953-div-37,

0

Nel tuo progetto-> Generale-> Informazioni sulla distribuzione

Stile barra di stato: -

appena contrassegnato Nascondi barra di stato (iOS 10)


0

Swift 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true

ok per ora non ho iOS 12 ho 11.4 quando il suo aggiornamento lo risolverò anche io, anche se hai teamviewer verrò e lo riparerò sul tuo sistema
Shakeel Ahmed,

è deprecato
Vyachaslav Gerchicov

0

Aggiornato per iOS 13 e Swift 5

Se nessuna delle risposte precedenti funziona per te. Controlla il tuo plist per vedere se hai questo:

"Visualizza l'aspetto della barra di stato basata sul controller"

In tal caso, assicurati di impostarlo su SÌ !!!!!

Quindi funzionerà il seguente codice.

override var prefersStatusBarHidden: Bool {
    return true
}
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.