如何设置在Storyboard中定义的GMSMapView对象的中心位置

时间:2013-12-13 17:15:39

标签: ios objective-c google-maps-sdk-ios gmsmapview

我想将地图的中心初始化为自定义位置。这是我用于初始化的代码:

-(void)viewDidLoad{
    [super viewDidLoad];
    //mapView
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:41.0109
                                                            longitude:28.998
                                                                 zoom:6];
    self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
    [self.mapView setCenter:CGPointMake(41.0109,28.998)];
}

当我运行此代码时,我看到一张以格林威治为中心的地图,而不是我给相机的位置(41.0109,28.998)。

当我调试代码并打印出self.mapView.camera的位置时,这是输出:GMSCameraPosition 0x17742ee0: target:(41.011, 28.998) bearing:0.000 zoomLevel:6.000 viewingAngle:0.000 lookAhead:0.000。所以我成功设置了相机的位置,为什么它会以格林威治的位置打开?

修改

请注意,mapView是我添加到主页面的子视图(UIView),我试图设置和修改中心位置。 这是我的故事板的快照: enter image description here

当我尝试修改mapView时,我无法设置地图的位置。但是,如果我使用“视图”这是窗口的主视图,我可以成功地更改地图的中心。

为什么会这样?

如何设置GMSMapView的启动位置?

编辑2 可以找到此项目的源代码here

2 个答案:

答案 0 :(得分:6)

你最终得到了两个GMSMapView个对象。第一个是您在Interface Builder中创建的,第二个是您使用GMSCameraPosition方法中的-viewDidLoad对象以编程方式创建的那个。

似乎self.mapsView引用了您在Interface Builder中创建的视图。使用此行分配新的GMSMapView对象时;

self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

您实际上正在丢失在Interface Builder中创建的那个,因此您尝试更改摄像机位置无效,因为您正在将消息发送到错误的对象。

另外,由于在以编程方式创建第二个GMSMapView对象后未将其添加到视图层次,因此在-viewDidLoad方法中,您没有在应用中看到它。虽然它可以正确设置相机位置。

所以你有两个选择;

1-从界面构建器中删除mapView(并取消绑定其出口),不要触摸代码,而是替换此行;

[self.mapView setCenter:CGPointMake(41.0109,28.998)];

这一行;

[self.view addSubview:self.mapView];

这样您就可以通过编程方式创建地图视图。

2-请勿触摸故事板,但请删除此行;

self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

因此,您将在Interface Builder中创建一个地图视图并进行配置。

然后一切都会好的。

答案 1 :(得分:0)

在添加GMSMapView或任何其他自定义自定义视图时,您通常可以做什么,并且您仍然希望使用Interface Builder的机制。是从IB库中添加一个简单的View,然后转到 Identity Inspector 并将Class更改为GMSMapView。而且你准备好了 - 你可以应用约束,为你的ViewController制作一个插座等等。