我将 MapViewController
嵌入到 UINavigationController
中。我从此 View Controller 推送到多个 View Controller ,从这些 View Controller 弹出到 MapViewController
。
在MapViewController
中,我有谷歌地图,其顶部位置从safeAreaLayoutGuide
开始。我根据多种条件隐藏和显示导航 Controller 。例如,当我显示 subview1 时,我隐藏导航栏,当我显示 subview2 时,我显示导航栏,等等...
现在我想在导航栏可见性发生变化时更改 map View 顶部位置。
如何解决这个问题?
- 我检查了UINavigationControllerDelegate 。当导航栏显示/隐藏时,没有调用委托(delegate)方法,我可以在其中更新 map View 顶部位置。 当导航栏可见性更改时,不会调用
viewDidLayoutSubviews
。 我只想在MapViewController
中执行此操作。不在这个推送的 View Controller 中。
最佳答案
您可以将属性观察器添加到navigationBar
的isHidden
属性,然后观察所做的任何更改,即
var observer: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
self.observer = self.navigationController?.navigationBar.observe(\.isHidden, options: [.new], changeHandler: { (navigationBar, changes) in
if let newValue = changes.newValue {
print(newValue)
topConstraint.constant = newValue ? 0 : self.view.safeAreaInsets.top
}
})
}
当 navigationBar
的 isHidden
属性发生任何更改时,我们将在闭包中收到回调并采取相应的操作。
关于ios - 如何添加观察者来查找导航栏的显示和隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077604/