J'essaie de masquer la barre d'état dans l'un de mes contrôleurs UIView (Swift 4).
Tout d'abord, je règle Afficher l'apparence de la barre d'état basée sur le contrôleur surYESin Info.plist
.
J'ai remplacé la propriété prefersStatusBarHidden
dans mon contrôleur:
override var prefersStatusBarHidden: Bool {
return true
}
viewDidLoad()
, j’ai ajouté la fonction setNeedsStatusBarAppearanceUpdate()
pour forcer la lecture de la propriété prefersStatusBarHidden
. Après tout cela, je vois toujours la barre d’état sur cette UIViewController
.
Quelqu'un peut-il m'aider, s'il vous plaît?
Vous pouvez masquer la barre d'état dans tout ou partie de vos contrôleurs de vue en ajoutant simplement le code suivant:
override var prefersStatusBarHidden: Bool {
return true
}
Tout contrôleur de vue contenant ce code masquera la barre d'état par défaut.
Si vous souhaitez animer la barre d'état, appelez simplement setNeedsStatusBarAppearanceUpdate () sur votre contrôleur de vue, ce qui forcera prefersStatusBarHidden à être relu, et vous pourrez alors renvoyer une valeur différente. Si vous le souhaitez, votre appel à setNeedsStatusBarAppearanceUpdate () peut se trouver réellement dans un bloc d’animation, ce qui permet à la barre d’état de se masquer ou de s’afficher de manière fluide.
Vous avez probablement déjà trouvé votre propre solution à ce problème, mais je l’ai fonctionné ainsi:
override func viewWillAppear(_ animated: Bool) {
// Sets the status bar to hidden when the view has finished appearing
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
// Sets the status bar to visible when the view is about to disappear
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.isHidden = false
}
Bien que certaines implémentations soient plus propres telles que:
UIApplication.shared.isStatusBarHidden = true
Il y a des animations de coupures étranges pendant les transitions. Bien que plus verbeuse, je préfère la solution de @ MachTurtle:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView{
statusBar.isHidden = true
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.isHidden = false
}
Essayez-le, fonctionne très bien pour moi.
Utilisez le code suivant UIApplication.shared.isStatusBarHidden = true
c’est la seule chose que j’ai trouvée qui fonctionne dans iOS11 . Vous pouvez écrire dans didFinishLaunchingWithOptions
ou dans 'viewWillAppear' de vous BaseViewController
Enjoy.
Comme vous l'avez dit, vous utilisez UINavigationController pour accéder à votre contrôleur de vue personnalisé. Je suppose que vous avez défini votre contrôleur de vue personnalisée comme vue racine de votre UINavigationController. Dans ce cas, le remplacement de var prefersStatusBarHidden dans votre contrôleur de vue personnalisé ne fonctionnera pas, mais vous devrez sous-classer votre contrôleur UINavigation et remplacer la propriété à cet endroit, comme indiqué ci-dessous:
class CustomNavigationController: UINavigationController {
override var prefersStatusBarHidden: Bool {
return true
}
}
Il suffit de changer la contrainte "Espace supérieur à" de votre vue de Zone sécurisée à Superview. Et cela fera glisser votre vue sous la barre d'état, il n'y aura donc pas besoin de la cacher] 1
Si vous présentez le contrôleur de vue de manière modale, essayez
viewController.modalPresentationCapturesStatusBarAppearance = true
Aucune de ces solutions ne fonctionnait pour moi non plus sur un projet converti sous iOS 11. Voici ce que j'ai fait. J'ai ajouté ce code dans le AppDelegate
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
{
application.isIdleTimerDisabled = true
application.isStatusBarHidden = true
return true
}