Comment masquer la barre d'état dans une application Swift iOS?


201

Je voudrais supprimer la barre d'état en haut de l'écran.

Cela ne fonctionne pas:

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

J'ai aussi essayé:

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
}

Réponses:


450

Vous devez vraiment implémenter prefersStatusBarHidden sur vos contrôleurs de vue:

Swift 3 et versions ultérieures

override var prefersStatusBarHidden: Bool {
    return true
}

4
Je pense que l'intention de Jay est de masquer la barre d'état pour l'application complète. C'est pourquoi il aurait écrit la fonctionnalité de masquage dans l'application didFinishLaunchingWithOptions de l'application. Comment masquer la barre d'état pour une application complète?
Satyam

@Satyam a un bon point, ce serait bien de supprimer cela dans toute l'application. Existe-t-il une approche pour implémenter cela par héritage? Ou via l'extension de protocole?
Dan Beaulieu

3
@DanBeaulieu Je pense que l'héritage serait une excellente solution. Créez une sous-classe UIViewController où la barre cachée est définie sur true, puis faites en sorte que toutes vos sous-classes héritent de celle-ci. Une autre approche pourrait être d'utiliser Swizzling
criseGriega

1
Le code Swift 3 n'a pas fonctionné, voir: stackoverflow.com/a/38902285/129202
Jonny

1
Dans cette méthode, il y a un défaut: lorsque vous souhaitez effectuer une séquence, votre vue parent du viewcontroller actuel tombe d'environ 20 px
iman kazemayni

99
  1. Accédez au fichier Info.plist
  2. Passez la souris sur l'une de ces lignes et un bouton (+) et (-) apparaîtra.
  3. Cliquez sur le bouton plus pour ajouter un nouveau type de clé en commençant par V majuscule et automatiquement le premier choix sera Afficher l'apparence de la barre d'état basée sur le contrôleur.
  4. Ajoutez cela comme CLÉ.
  5. Réglez la VALEUR sur "NON"
  6. Allez à vous AppDelegate.swift
  7. Ajoutez le code, à l'intérieur de la méthode

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

TERMINÉ! Exécutez votre application et plus de barre d'état!


1
Au début, je pensais que cette solution fonctionnait bien, mais j'ai remarqué ensuite qu'elle provoquait une erreur que je devais déboguer avec CG_CONTEXT_SHOW_BACKTRACE. Il est revenu à l'ajout de "Afficher l'apparence de la barre d'état basée sur le contrôleur"
Sean

A bien fonctionné pour moi dans IOS 9 2.2
uplearnedu.com

1
A travaillé pour le simulateur iOS 10.1. Merci, @nycdanie.
Jérôme

7
En plus de régler «Afficher l'apparence de la barre d'état basée sur le contrôleur» sur NON, ajoutez également «La barre d'état est initialement masquée» réglée sur «OUI». Ensuite, vous n'avez pas besoin d'ajouter de code dans le contrôleur de vue et la barre d'état sera masquée dans toute l'application. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF

1
@tylerSF fonctionne très bien! Vous devriez ajouter ceci comme réponse :)
Pétur Ingi Egilsson

72

Swift 3

En Info.plistsetView controller-based status bar appearance àNO

Et appeler UIApplication.shared.isStatusBarHidden = true


1
Si elle est définie sur Oui, c'est la seule façon dont cela fonctionnera.
farzadshbfn

@farzadshbfn c'est faux. Comme mentionné et testé par moi, cela fonctionne avec le booléen NO.
Codetard

43

Si vous souhaitez masquer et ramener la barre d'état au toucher du bouton , alors qu'au moment de présenter et de fermer le menu coulissant , des popups etc., vous pouvez utiliser cette méthode: -

Pour masquer la barre d'état: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Pour ramener la barre d'état: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

C'est plus un hack. Je ne voudrais pas me mêler de la fenêtre comme ça ... surtout si une solution existe déjà. J'encourage les développeurs à remplacer la prefersStatusBarHiddenpropriété comme ce qui a déjà été mentionné.
Stephen Paul

2
cela peut être utilisé si nous voulons masquer et ramener momentanément la barre d'état .. dans mon application, lorsque le menu coulissant vient du côté gauche, je dois cacher la barre d'état. et lorsque le menu disparaît, nous devons ramener la barre d'état, comme dans l'application iOS de gmail .. donc dans ce genre de scénarios, nous pouvons l'utiliser.
Vincent Joy

3
Il est un hack, et je te mêle pas avec elle, mais il ne le travail pour le moment. Un peu comme vous le dites tous. Le problème prefersStatusBarHiddenest que les vues liées à la barre d'état à l'aide de contraintes, ainsi que les barres de navigation, se déplaceront de manière incorrecte si vous activez / désactivez la barre d'état à l'aide de prefersStatusBarHidden . Pour l'instant, seule cette réponse semble contourner ce problème.
Jonny

Tout à fait d'accord avec @Jonny, je n'aime pas non plus cette solution, mais comme il l'a dit, le dépassement gâchera prefersStatusBarHiddenvotre contrainte. Jusqu'à présent, cela fait le travail. Cependant, j'utilise un petit emballage pour éviter d'utiliser des singletons, vous pouvez le trouver ici
rgkobashi

34

si vous préférez une approche visuelle plutôt que de la coder, utilisez cette méthode: dans votre info.plist

entrez la description de l'image ici ajouter simplement View controller-based status bar appearanceàNO

et Status bar is initially hiddencommeYES


Ceci est la réponse canonique en 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

Mise à jour pour iOS 10 / Swift 3.0

Plus une fonction, maintenant une propriété ...

override var prefersStatusBarHidden: Bool {
    return true
}

Savez-vous comment définir cela dans toute l'application, je dois actuellement entrer cela dans chaque viewController
William T.

Essayez le menu Rechercher, puis Rechercher et remplacer dans le projet? Peut-être? Mais cette sacrée accolade supplémentaire avec le nid get ... hmmm .... dunno. bonne question!
atlwx

prefersStatusBarHidden n'a jamais été appelé
Bagusflyer

6
Vous n'avez pas besoin de get { }si vous n'en avez pas set, écrivez simplementreturn true
Daniel

16

dans Swift 3.x:

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

Ceci est déconseillé dans iOS 9.0
Georgios

16

Accédez à votre Info.plist et ajoutez deux clés:

Accédez à votre Info.plist et ajoutez deux clés:


12

Donc, le problème ici n'a rien à voir avec Swift, mais juste comment l'apparence de la barre d'état est gérée depuis iOS 7.

Par défaut, les contrôleurs de vue contrôlent individuellement l'apparence de la barre d'état lorsqu'ils sont à l'écran. Si vous souhaitez utiliser cette méthode de contrôle de la barre d'état, vous pouvez remplacer les méthodes suivantes pour les contrôleurs de vue dont vous souhaitez modifier l'apparence:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation ,

Dans votre cas, vous implémenteriez prefersStatusBarHiddenet reviendriez true.

L'autre façon serait de contrôler l'apparence de la barre d'état au niveau de l'application. Cela semble être ce que vous essayez de faire (en définissant application.statusBarHidden).

Pour que cela fonctionne, vous devez ouvrir le Info.plistfichier de votre application et ajouter la clé UIViewControllerBasedStatusBarAppearanceet lui donner une valeur de NO.


1
Je pense que vous voulez dire true pour prefersStatusBarHidden. NO appartient à ObjC et est de toute façon la mauvaise valeur booléenne.
HenryRootTwo

@HenryRootTwo pas dans les fichiers .plist. Là, nous utilisons toujours OUI / NON
Alex Salom

8

En fait, je l'ai compris moi-même. Je vais ajouter ma solution comme une autre option.

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

Belle approche pour garder les choses propres et modulaires
Roger Fernandez Guri

2
Je ne peux pas implémenter cela. C'est peut-être parce que maintenant j'utilise Swift 1.2. J'obtiens l'erreur: "La méthode 'prefersStatusBarHidden ()' avec le sélecteur Objective-C 'prefersStatusBarHidden' entre en conflit avec la déclaration précédente avec le même sélecteur Objective-C". J'ai également ajouté le mot clé override au début, mais j'obtiens toujours la même erreur.
Andrej

Devez-vous l'ajouter à chaque vue?
Sean

Ne fonctionne pas dans Swift 2, affiche une erreur comme expliqué par @Andrej ci-dessus.
Nagendra Rao

4

D'accord, cela devient donc un problème pour moi car iOS 9 ne prend pas en charge la méthode mentionnée ici, comme UIApplication.sharedApplication().statusBarHidden = true ou

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

et

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

fonctionne mais ne fournit pas de solution programmable où je peux changer à une condition. ( statusBarHidden = trueet statusBarHidden = falsecomme nous l'avons fait auparavant).

Solution à cette folie:

En ajoutant des éléments prefersStatusBarHidden()comme ci-dessous, vous pouvez contrôler par programme le masquage et l' affichage de la barre d'état sans ajouter de UIViewControllerBasedStatusBarAppearanceparamètre à votre info.plist :

var showStatusBar = true

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

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

puis utilisez-le comme ceci dans tout votre code:

//Hide Status Bar
showStatusBar(false)

OU

//Show Status Bar
showStatusBar(true)

1
L' prefersStatusBarHiddenappel a- t - il un sens? Je suppose que vous voulez dire self.setNeedsStatusBarAppearanceUpdate()après showStatusBaraffectation
Leo

C'est vraiment de la folie, non? Quelle API pitoyable c'est, et ça fait si longtemps. Ce genre de chose rend le développement iOS incroyablement frustrant à certains moments.
Womble

@Womble, oui et cela peut aussi devenir assez compliqué. Espérons que Swift 3.0 possède une meilleure bibliothèque et prend en charge, car à première vue, cela va changer beaucoup de swift 2.3 ... cassant des trucs.
CodeOverRide

Au lieu d'appeler prefersStatusBarHidden à partir de votre méthode, vous pouvez appeler setNeedsStatusBarAppearanceUpdate
Oscar

4

Juste pour ajouter, lors du remplacement de la prefersStatusBarHiddenméthode ou de la variable, le View controller-based status bar appearancefichier dans Info.plist doit être OUI, sinon le remplacement n'aura aucun effet


4

dans Swift 4.2, c'est maintenant une propriété.

override var prefersStatusBarHidden: Bool {
    return true
}

3

Dans mon cas, je cherchais la barre d'état pour masquer / afficher à la demande; au lieu du moment où la vue se charge ou disparaît.

rapide 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: dans le contrôleur de vue principal, ou le contrôleur de navigation principal si vous en avez,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

Et "Afficher l'apparence de la barre d'état basée sur le contrôleur" dans plist doit être OUI, sinon le code ci-dessus ne sera pas appelé.

Si vous souhaitez masquer la barre d'état lors du lancement de l'application, "La barre d'état est initialement masquée" dans plist doit être OUI. Cela peut empêcher la distorsion de l'image de lancement lorsqu'une barre bleue supplémentaire s'affiche en haut de l'écran.


2

Une solution qui fonctionne pour moi; si vous souhaitez masquer la barre d'état sur un contrôleur de vue spécifique lors du chargement:

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

Attention: si vous définissez la clé " Afficher l'apparence de la barre d'état basée sur le contrôleur " sur " NON " dans votre info.plist, le code ci-dessus ne fonctionne pas. Vous devez définir la clé sur " OUI " ou la supprimer de info.plist


Vous ne pouvez pas remplacer la propriété hideStatusBar car c'est une propriété stockée! vous pouvez cependant simplement choisir un autre nom et votre animation fonctionnera.
XcodeNOOB

2

Dans votre projet Général-> Informations sur le déploiement-> Style de la barre d'état sélectionnez la coche de Masquer la barre d'état Remarque: - il masque la barre d'état dans toute l'application


1
Cela fonctionne pour moi (iOS 12), où les réponses plist ne fonctionnent pas.
Threeve

2

Pour Swift 4+, essayez le code suivant (testé sur 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+

Dans mon cas, je dois mettre à jour la barre d'état cachée en fonction de certaines conditions.

Pour cette raison, je crée un contrôleur de base BaseViewControllerqui contient une nouvelle propriété hideStatusBar.

Les autres contrôleurs de vue sont des sous-classes de ce contrôleur de base. Enfin, lorsque je souhaite mettre à jour le comportement de la barre d'état, il me suffit de modifier cette hideStatusBarvaleur.

class BaseViewController: UIViewController {

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

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Comment utiliser

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

Démo

Voici une démo que j'utilise UIView.animate(...)pour rendre la transition plus fluide.

entrez la description de l'image ici


1

J'utilise Xcode 8.1 (8B62) avec une cible de déploiement définie sur 10.1 et je n'ai pas eu beaucoup de chance avec les options de remplacement mentionnées ci-dessus. Cependant, la vérification de l'option "Masquer la barre d'état" dans les informations de déploiement a fait l'affaire pour moi.

Projet> Général

J'espère que ça aide.


1

Si vous présentez le contrôleur de vue de manière modale, essayez

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

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

4
Lorsque vous répondez à une question, veuillez expliquer votre réponse, l'extrait de code n'est pas une bonne réponse.
LazerBanana

0

Vous pouvez utiliser ce code dans votre ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

Merci pour la réponse, voulez-vous en dire un peu plus. Où exactement il doit ajouter la ligne de code et pourquoi cela fonctionnerait-il? Voir la section Comment écrire une bonne réponse .
9953-div-37

0

Dans votre projet-> Général-> Informations de déploiement

Style de barre d'état: -

vient de marquer Masquer la barre d'état (iOS 10)


0

Swift 4

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

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

ok pour l'instant je n'ai pas d'ios 12 j'ai 11.4 quand sa mise à jour je le réparerai aussi, aussi si vous avez teamviewer je viendrai le réparer sur votre système
Shakeel Ahmed

il est obsolète
Vyachaslav Gerchicov

0

Mis à jour pour iOS 13 et Swift 5

Si aucune des réponses ci-dessus ne vous convient. Vérifiez votre plist pour voir si vous avez ceci:

"Afficher l'apparence de la barre d'état basée sur le contrôleur"

Si oui, assurez-vous de le régler sur OUI !!!!!

Ensuite, le code suivant fonctionnera.

override var prefersStatusBarHidden: Bool {
    return true
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.