Навбар не оживляет, когда прячется, но все еще оживляет, когда появляется

Я последовал этому ответу и добавил UIGestureRecognizer показать или скрыть панель навигации и панель инструментов. Странно, но Navbar не скрывается, когда прячется, но он все еще скользит, когда появляется снова. панель инструментов постоянно анимируется.

Я изменил код на:

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

чтобы увидеть, если он вызывается, когда он прячется, и он вызывается. Я тоже пробовал настройку automaticallyAdjustsScrollViewInsets в ложь, как это было предложено в комментариях к тому же ответу, но все равно не повезло.

Я не могу найти информацию об этой проблеме нигде.

РЕДАКТИРОВАТЬ: вот мой полный код:

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
}

3 ответа

Решение

Следующий код Swift 4 отлично работает с iOS 11, но не работает должным образом для iOS 10. При использовании его с iOS 10 по какой-то причине панель навигации не анимируется при скрытии и внезапно исчезает.

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
    }

}

Чтобы это исправить, вы можете использовать следующее ViewController реализация, которая использует UIViewController "s setNeedsStatusBarAppearanceUpdate() имущество:

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
    }

}

В качестве альтернативы вы также можете использовать UIViewController реализация ниже:

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
    }

}

Посмотрите этот ответ, в котором показано до 3 различных способов переключения как строки состояния, так и панели навигации для Swift 4 и iOS 11.

Проблема в том, что в iOS 11 navigationController?.IsNavigationBarHidden всегда возвращает false. В iOS 10 этот код работает правильно. Я еще не нашел обходной путь (((

Попробуй это:

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
     }
   }
Другие вопросы по тегам