OpenLayers:侧边栏折叠后如何重绘地图?

OpenLayers: How can I redraw a map after a sidebar is collapsed?

我正在使用 OpenLayers 来显示地图,并使用 AdminLte 作为界面。

我的问题: 当折叠给定页面上的主要左侧边栏时,所有框及其包含的内容都会改变大小(我真的不知道如何改变)所以地图也变大了。问题是,当它发生时,地图上显示的所有特征显然都改变了位置,不再是它们应该在的位置。

我想要什么: 在侧边栏折叠后重绘地图。

有什么建议吗?

我试过了:

$('.navbar-collapse').on('shown.bs.collapse', function() {
    map.updateSize();
});

和:

$('.sidebar').on('shown.bs.collapse', function() {
   map.updateSize();
});

但无济于事...

编辑: 我的问题与此类似:OpenLayers: How to re-align mouse coordinates and vector layers after fluid css rendering of map div 但他的解决方案对我不起作用:)

编辑 2 : 澄清一下:我认为我的问题的解决方案是在边栏完成折叠时调用 map.updateSize() 方法。问题是我不知道如何捕捉侧边栏完成的时刻collapsing/expanding!

如果您尝试在侧边栏折叠重新绘制地图,请将您的事件处理程序更改为以下内容:

$('.sidebar').on('hidden.bs.collapse', function() {
   map.updateSize();
});

根据事件处理程序列表 here,当折叠元素对用户隐藏时,将触发 hidden.bs.collapse 事件。

我找到的一个临时解决方案是在按钮触发侧边栏折叠时开始超时,然后调用 map.updateSize() 方法:

  $('.sidebar-toggle').click(function(){
      setTimeout(function(){ map.updateSize(); }, 500);             
  });

它有效……但有点无聊:/

我有同样的问题,使用 React 和一个 class 组件我的(糟糕的)解决方案是这样的:

shouldComponentUpdate = async () =>
  await new Promise(res =>
    setTimeout(() => {
      this.map.updateSize()
      res(false)
    }, 500)
  )

这很糟糕,因为调整大小会导致地图跳跃。如果有一种方法可以在不跳转的情况下实现地图大小调整,那就太棒了。

(500是我抽屉关闭的动画时间)