web-dev-qa-db-fra.com

Barre d'état IOS7 masquer / afficher sur certains contrôleurs

Je souhaite afficher et masquer la barre d'état sur certains contrôleurs. Cela peut-il être fait ou s'agit-il davantage d'un paramètre d'application global?.

J'ai vu beaucoup de messages/questions sur la mise à jour de plist:

View controller-based status bar appearance - NO

Si cela est terminé, quel contrôle est donné?

Je cherche à afficher la barre d'état sur l'écran principal de l'application. Mais, par exemple, sur un menu latéral (diapositive) que je ne voudrais pas montrer, est-ce possible? Cela peut-il être changé en IB ou en code?

EDIT - J'utilise une https://github.com/edgecase/ECSlidingViewController implémentation.

Le contrôleur principal (affichant la première page) doit afficher la barre d'état, mais le contrôleur de menu de gauche ne glisse pas.

Je pense que le problème est qu’ils reposent tous deux dans le même contrôleur racine (contrôleur de vue glissante), ce qui rend sa réalisation difficile.

Idéalement, si l'écran d'accueil (page principale) peut afficher la barre d'état lorsqu'il glisse, cela donnera un meilleur rendu.

44
StuartM

Le réglage du plist "View controller-based status bar appearance" contrôle uniquement si un paramètre basé sur un contrôleur doit être appliqué sur iOS 7.

Si vous définissez cette option sur NO, vous devez activer et désactiver manuellement la barre d'état de la même manière (jusqu'à iOS 6):

[[UIApplication sharedApplication] setStatusBarHidden:YES]

Si vous définissez cette option sur OUI, vous pouvez ajouter cette méthode à chacun de vos viewControllers afin de définir le statusBar indépendamment pour chaque contrôleur (ce qui est particulièrement agréable si vous avez un système intelligent de viewControllers de sous-classe intelligente).

- (BOOL)prefersStatusBarHidden {
    return YES;
}

Edit:

il existe deux autres méthodes intéressantes si vous optez pour la nouvelle apparence de la barre d'état basée sur viewController -

Forcer une mise à jour de la barre d'état avec:

[self setNeedsStatusBarAppearanceUpdate]

Si vous avez des contrôleurs imbriqués (par exemple, un contentViewController dans une sous-classe TabBarController, votre sous-classe TabBarController peut demander si elle est actuellement childViewController et transférer ce paramètre. Je pense que dans votre cas spécifique, cela pourrait être utile:

- (UIViewController *)childViewControllerForStatusBarHidden {
     return _myChildViewController;
}
- (UIViewController *)childViewControllerForStatusBarStyle {
     return _myOtherViewController;
}
128
auco

Sur iOS 7 et versions ultérieures, implémentez simplement -prefersStatusBarHidden _, par exemple dans un UIViewController qui devrait masquer la barre d'état:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

La valeur par défaut est NO.

14
Mojo66

Swift:

override var prefersStatusBarHidden: Bool {
    return true
}
14
Danut Pralea

Vous pouvez également afficher/masquer la barre d'état dans un bloc d'animation en plaçant le code d'animation dans la propriété didSet de la variable qui indique si elle doit être affichée ou masquée. Lorsque vous définissez une nouvelle valeur pour le booléen statusBarHidden, cela déclenche automatiquement la mise à jour animée de la barre d'état sur la durée que vous avez choisie.

/// Swift 3 syntax: 

var statusBarHidden: Bool = true {
    didSet {
        UIView.animate(withDuration: 0.5) { () -> Void in
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }
}

override var prefersStatusBarHidden: Bool {
    return statusBarHidden
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)        
    statusBarHidden = false // show statusBar, animated, by triggering didSet block
}
4
Natalia

Version rapide de Mojo66réponse :

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