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
}
Geai
la source
Copie possible de Comment masquer une barre d'état dans iOS?
Jake Chasan

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
}
drewag
la source
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!

nycdanie
la source
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

Joseph Mark
la source
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 
Vincent Joy
la source
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

MiladiuM
la source
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
}
Mohit Tomar
la source
28

Mise à jour pour iOS 10 / Swift 3.0

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

override var prefersStatusBarHidden: Bool {
    return true
}
atlwx
la source
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
}
Samira Ekrami
la source
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:

janaz
la source
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.

Dima
la source
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
    }
}
Geai
la source
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)
CodeOverRide
la source
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

Huanyan
la source
4

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

override var prefersStatusBarHidden: Bool {
    return true
}
Rawand Saeed
la source
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()
Felecia Genet
la source
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.

Sam Xu
la source
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

andre_hold
la source
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

Sweta Vani
la source
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()
}
Coder ACJHP
la source
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

nahung89
la source
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.

danmerfeld
la source
1

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

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
YannSteph
la source
0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        application.isStatusBarHidden = true
        return true
    }
Prasad Bulbule
la source
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 }
Sajjad
la source
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)

VD Purohit
la source
0

Swift 4

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

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
Shakeel Ahmed
la source
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
}
Legolas Wang
la source