如何在不移动地图的情况下更改 GMSMapView 填充

Posted

技术标签:

【中文标题】如何在不移动地图的情况下更改 GMSMapView 填充【英文标题】:How can I change GMSMapView padding without moving the map 【发布时间】:2015-07-30 11:50:51 【问题描述】:

我希望能够在不更改地图位置的情况下更改 GMSMapView 的填充。现在,Google Maps ios SDK 会更改地图位置,以便在应用填充后同一点位于中心。这与 android SDK 的工作方式不同,后者只是让地图保持原样。

我为此找到了一个轻微的解决方法,但它不能始终如一地工作。当我使用以下内容更改填充时,我可以计算新的中心位置并更新地图相机...

UIEdgeInsets oldPadding = self.mapCtrl.map.padding;
UIEdgeInsets newPadding = UIEdgeInsetsMake(top, left, bottom, right);

float deltaX = ((newPadding.right - newPadding.left)/2 - (oldPadding.right-oldPadding.left)/2);
float deltaY = ((newPadding.top - newPadding.bottom)/2 - (oldPadding.top-oldPadding.bottom)/2);

GMSCameraUpdate *updatedCamera = [GMSCameraUpdate scrollByX:deltaX Y:deltaY];

[self.mapCtrl.map setPadding:newPadding];
[self.mapCtrl.map moveCamera:updatedCamera];

但我会说它只能工作 50%。地图的另外 50% 移动到新的填充位置,然后返回到我想要的位置。

我看到了两种可能的解决方案... A) 以不同的方式更改填充,使其不会移动地图,或 B) 通过某种方式暂停或找出使上述代码工作的方法对地图移动进行分组,以便两个呼叫一次通过。但我不知道如何使这两件事发生。

【问题讨论】:

【参考方案1】:

确保顶部和底部的填充相同,以使所有内容保持居中。

【讨论】:

【参考方案2】:

以防将来有人需要:

mapView.padding = newPadding
mapView.layer.removeAllAnimations()

这与 GMSMapView 的内部结构相混淆,并且填充没有正确应用于地图本身,只是应用于 UI。

我使用以下代码在动画后再次重新应用填充,以便地图再次正常运行。

let newCenter = mapView.projection.coordinate(for: mapView.bounds.inset(by: newMapViewPadding).center)
mapView.padding = newMapViewPadding + UIEdgeInsets(all: 1)
mapView.padding = newMapViewPadding
mapView.moveCamera(GMSCameraUpdate.setTarget(newCenter))

【讨论】:

【参考方案3】:

我们需要设置一个带有顶部和底部的填充以保持事物正确显示是正确的,但在将视图附加到其父级之后执行此操作也很重要。

我以前做过,但效果不好。

【讨论】:

以上是关于如何在不移动地图的情况下更改 GMSMapView 填充的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改用户设置的缩放比例的情况下更新地图标记?

如何在不重新加载页面的情况下更新从 firestore 检索到的标记在我的地图上?

如何在不丢失或复制任何记录的情况下移动或更改管道

GMSMapView:如何管理内存?

如何在不抬起手指的情况下更改我按下的按钮? (在LibGDX中)

如何在不使用 setCoordinate 的情况下更新注释?