Навбар не оживляет, когда прячется, но все еще оживляет, когда появляется
Я последовал этому ответу и добавил 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
}
}