web-dev-qa-db-fra.com

Comment masquer la barre d'état d'un contrôleur de vue unique dans iOS 9?

Dans un ViewController, que j'ai présenté de manière modale, j'ai fait ceci:

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

Cela fonctionnait, mais cela ne fonctionne plus. Quel est le meilleur moyen de masquer la barre d'état uniquement pour ce contrôleur de vue?

37
TIMEX

Pour Swift 3 & Swift 4, il a été remplacé par une variable telle que:

override var prefersStatusBarHidden: Bool {
  return true
}

Si vous souhaitez "mettre à jour" l'état une fois que le contrôleur de vue est déjà affiché, vous devez appeler:

setNeedsStatusBarAppearanceUpdate()

Veuillez vous référer à documentation .

59
Pochi

Pour Swift 3 et Swift 4.2 Lorsque la vue passe à Apparaître

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

    UIApplication.shared.isStatusBarHidden = true
}

quand la vue va disparaître

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

    UIApplication.shared.isStatusBarHidden = false
}

Il est possible que vous ayez besoin de définir dans votre info.plist, ligne suivante:

View controller-based status bar appearance = NO

 enter image description here

38
gandhi Mena

Dans iOS 9, Xcode 7, Swift 2.0, vous retrouvez ce qu’il était auparavant.

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

En fait, Xcode vous dira que

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

est déconseillé et que vous devez utiliser la méthode prefersStatusBarHidden.

19
Greg

Dans votre 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
}
19
anasaman_p

Pour Swift 3,

override var prefersStatusBarHidden: Bool{
        return true
    }

et ajoutez viewDidLoad()

self.modalPresentationCapturesStatusBarAppearance = true
9
Ali BOZOĞLU

Vous pouvez y parvenir simplement en remplaçant la propriétéprefersStatusBarHidden dans votre ViewController comme indiqué ci-dessous:

override var prefersStatusBarHidden: Bool {
   return true
}

 Screenshot added

Cela fonctionne pour Swift 3/4.

4
Jayprakash Dubey

Pour ceux qui luttent encore, le programme ci-dessous fonctionne pour iOS9.

Vous mettez à jour la fonction rootViewController prefersStatusBarHidden en l’appelant à partir de votre enfant ViewControllers enfant/petit-enfant. Cela fonctionne là où vous ajoutez childViewControllers directement à votre rootViewController. 

Vous n'avez pas besoin de définir quoi que ce soit dans info.plist, mais le paramètre 'statusBarIsInitiallyHidden' fonctionne indépendamment de ce qui suit.

Tout d’abord, dans votre rootViewController, ajoutez ce qui suit:

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

Ensuite, dans le contrôleur de vue unique où vous souhaitez masquer la barre d'état, appelez ceci:

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

Utilisez ce code:

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

    UIApplication.shared.isStatusBarHidden = true
}

si ce code ne fonctionne pas, vous devez ajouter cette clé dans le fichier info.plist

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

1
Diego Carrera

Vous pouvez utiliser

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

Quand tout échoue (comme il l’a fait pour moi) ???? Swift 4.1

Aucune édition de .plist requise. Et l'AppStore va l'approuver

(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
1
eonist

Masquer la barre d'état en douceur en utilisant simplement UIAnimation et la propriété stockée.

Swift 3+

  var statusBarState = false
    override var prefersStatusBarHidden: Bool{
        return statusBarState
    }

Et puis dans viewWillAppear

  override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        statusBarState = true
        UIView.animate(withDuration: 0.30) {
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }

 enter image description here

0
rizwan

Une réponse tardive, mais si vous avez besoin d'une solution alternative, vous pouvez l'utiliser:

public func ShowStatusBar() {

    let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
    UIView.animate(withDuration: 0.3) {
        statusBarWindow?.alpha = 1
    }
}

public func HideStatusBar() {

    let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
    UIView.animate(withDuration: 0.3) {
        statusBarWindow?.alpha = 0
    }
}
0
Hakan Baybas

J'utilise Xcode Version 9.2/Swift 3.2/iOS 11

J'ai reçu ce formulaire de réponse BADCloud bien que je ne sois pas sûr de savoir pourquoi cela n'a pas fonctionné pour lui.

Quoi qu'il en soit, cela a fonctionné pour moi pour un contrôleur de vue spécifique. 

La différence entre cette réponse et les autres réponses ici est que, dans mon info.plist quand j’avais initialement Afficher l’apparence de la barre d’état basée sur le contrôleur - NO avec les deux méthodes statusBar ci-dessous, cela ne fonctionnait pas mais quand j il est travaillé avec Oui avec les deux.

Dans la modification info.plist: Afficher l’apparence de la barre d’état basée sur le contrôleur - YES enter image description here

Dans le contrôleur de vue, vous voulez que cela change en ajoutant:

override func viewDidLoad() {
        super.viewDidLoad()

        // add this in ViewDidLoad
        setNeedsStatusBarAppearanceUpdate()
}

// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
  return true
}
0
Lance Samaria

Solution complète pour iOS 11 et Swift 4, vous donnant le contrôle total de votre programme.

var statusBarHidden : Bool?

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

Maintenant, vous pouvez simplement afficher ou masquer la barre d'état en définissant la propriété à partir de votre code. Je l'ai testé comme ça:

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

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

Fonctionne comme un charme.

0
Smiling Shadow