ios - 如何添加观察者来查找导航栏的显示和隐藏

标签 ios uinavigationcontroller

我将 MapViewController 嵌入到 UINavigationController 中。我从此 View Controller 推送到多个 View Controller ,从这些 View Controller 弹出到 MapViewController

MapViewController中,我有谷歌地图,其顶部位置从safeAreaLayoutGuide开始。我根据多种条件隐藏和显示导航 Controller 。例如,当我显示 subview1 时,我隐藏导航栏,当我显示 subview2 时,我显示导航栏,等等...

现在我想在导航栏可见性发生变化时更改 map View 顶部位置。

如何解决这个问题?

  • 我检查了UINavigationControllerDelegate 。当导航栏显示/隐藏时,没有调用委托(delegate)方法,我可以在其中更新 map View 顶部位置。
  • 当导航栏可见性更改时,不会调用
  • viewDidLayoutSubviews。 我只想在 MapViewController 中执行此操作。不在这个推送的 View Controller 中。

最佳答案

您可以将属性观察器添加到navigationBarisHidden属性,然后观察所做的任何更改,即

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
        }
    })
}

navigationBarisHidden 属性发生任何更改时,我们将在闭包中收到回调并采取相应的操作。

关于ios - 如何添加观察者来查找导航栏的显示和隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077604/

相关文章:

objective-c - 使用 UINavigationController View 进行内存管理

iphone - 将对象设置为 nil 与在 dealloc 中向其发送释放消息有什么区别

ios - 如何优雅地处理使用带有闭包的 NSURLSessionTask 的方法中的错误?

ios - 更改 SpriteKit 节点的纹理

ios - 使用 MapKit 将 View 集中到用户位置的按钮

ios - 单击 "load earlier items"按钮时如何将 UITableView 滚动位置设置为上一个位置

ios - 我如何管理可能无休止地将 View Controller 推送到导航 Controller 堆栈? iOS

iOS 13 UIBarButtonItem 字体

ios - 在 viewDidLoad 中调用 Web 服务导致屏幕挂起 iOS

iphone - 黑色半透明导航栏 + MKMapView -> 设置 map 中心在视觉上不正确