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

时间:2015-05-18 20:30:24

标签: google-maps-sdk-ios

我希望能够在不使用更改地图位置的情况下更改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)找出一种方法来通过某种方式暂停或上述代码来使上述代码工作对地图移动进行分组,以便两个呼叫只能立即通过。但我无法弄清楚如何使这两件事发生。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

以防将来有人需要它:

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

答案 2 :(得分:0)

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

我以前这样做过,但不能正常工作。