5

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

-(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),我试图设置和修改中心位置。这是我的故事板的快照: 在此处输入图像描述

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

为什么会这样?

如何设置 GMSMapView 的启动位置?

编辑 2 这个项目的源代码可以在这里找到

4

2 回答 2

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 中创建一个地图视图并对其进行配置。

那么一切都会好起来的。

于 2013-12-19T14:54:46.357 回答
0

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

于 2014-11-15T10:11:42.457 回答