2017-07-11 5 views
1

J'ai suivi this answer et ajouté un UIGestureRecognizer pour afficher ou masquer la barre de navigation et la barre d'outils. Curieusement, la barre de navigation ne se couche pas en se cachant mais elle glisse quand elle réapparaît. la barre d'outils est animée tout le temps.La barre de navigation ne s'anime pas en se cachant mais elle s'anime tout en réapparaissant

J'ai changé le code:

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    print("got called") 
    return UIStatusBarAnimation.slide 
} 

pour voir si elle est appelée quand il se cache et il est appelé se. J'ai également essayé de mettre automaticallyAdjustsScrollViewInsets à faux comme suggéré par les commentaires de la même réponse mais toujours pas de chance.

Je ne trouve aucune information sur ce problème n'importe où.

EDIT: voici mon code complet:

override func viewDidLoad(){ 
    super.viewDidLoad() 
    self.automaticallyAdjustsScrollViewInsets = false 
    let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) 
    view.isUserInteractionEnabled = true 
    view.addGestureRecognizer(gesture) 
} 

func toggle() { 
    navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true) 
    navigationController?.setToolbarHidden(navigationController?.isToolbarHidden == false, animated: true) 
} 
override var prefersStatusBarHidden: Bool { 
    print("got called 1") 
    return navigationController?.isNavigationBarHidden == true 
} 

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    print("got called 2") 
    return UIStatusBarAnimation.slide 
} 

Répondre

1

Le code Swift 4 suivant fonctionne très bien avec iOS 11 mais ne fonctionne pas comme prévu pour iOS 10. En cas d'utilisation Avec iOS 10, pour une raison quelconque, la barre de navigation n'anime pas lorsque vous vous cachez et disparaît soudainement.

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) 
     view.addGestureRecognizer(gesture) 
    } 

    @objc func toggle() { 
     navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true) 
    } 

    override var prefersStatusBarHidden: Bool { 
     return navigationController?.isNavigationBarHidden == true 
    } 

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
     return UIStatusBarAnimation.slide 
    } 

} 

Pour résoudre ce problème, vous pouvez utiliser l'implémentation ViewController suivante qui utilise setNeedsStatusBarAppearanceUpdate() propriété de UIViewController:

class ViewController: UIViewController { 

    override func viewDidLoad(){ 
     super.viewDidLoad() 

     let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) 
     view.addGestureRecognizer(gesture) 
    } 

    private var isHidden = false 

    @objc func toggle() { 
     navigationController!.setNavigationBarHidden(!isHidden, animated: true) 
     isHidden = navigationController!.isNavigationBarHidden 

     UIView.animate(withDuration: 0.3) { 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 
    } 

    override var prefersStatusBarHidden: Bool { 
     return isHidden 
    } 

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
     return UIStatusBarAnimation.slide 
    } 

} 

Comme alternative, vous pouvez également utiliser la UIViewController mise en œuvre ci-dessous:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad(){ 
     super.viewDidLoad() 

     let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) 
     view.addGestureRecognizer(gesture) 
    } 

    private var isHidden: Bool = false { 
     willSet { 
      self.navigationController!.setNavigationBarHidden(!self.isHidden, animated: true) 
     } 
     didSet { 
      UIView.animate(withDuration: 0.3) { 
       self.setNeedsStatusBarAppearanceUpdate() 
      } 
     } 
    } 

    @objc func toggle() { 
     isHidden = !isHidden 
    } 

    override var prefersStatusBarHidden: Bool { 
     return isHidden 
    } 

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
     return UIStatusBarAnimation.slide 
    } 

} 

Voir this answer qui montre jusqu'à 3 différentes façons de basculer à la fois barre d'état et la barre de navigation pour Swift 4 et iOS 11.

0

Essayez ceci:

class ViewController: UIViewController { 
    var isHidden:Bool = false 
    @IBAction func clicked(sender: AnyObject) { 
     isHidden = !isHidden 
     UIView.animateWithDuration(0.5) {() -> Void in 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 
    } 
    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
     return UIStatusBarAnimation.Slide 
    } 
    override func prefersStatusBarHidden() -> Bool { 
     return isHidden 
    } 
    } 
+0

merci pour votre réponse, mais ce code ne fonctionne pas du tout pour une raison quelconque! Je dois appeler 'navigationController? .setNavigationBarHidden' pour cacher la Navbar, avec' setNeedsStatusBarAppearanceUpdate() ' , rien ne change. –

0

Le problème est que dans iOS 11 NavigationController? .isNavigationBarHidden retourne toujours faux. Dans iOS 10, ce code fonctionne correctement. Je n'ai pas encore trouvé la solution de contournement (((