GMSMapView myLocation没有给出实际位置

时间:2013-06-28 13:57:38

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

我有一个正确加载的GMSMapView并在我的viewcontroller中工作

我无法做的是在我的位置设置GMSCameraPosition

这是我的代码:

mapView_.myLocationEnabled = YES;
CLLocation* myLoc = [mapView_ myLocation];
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:myLoc.coordinate.latitude
                                                        longitude:myLoc.coordinate.longitude
                                                             zoom:4];
[mapView_ setCamera:camera];

GPS已启用且应用程序具有所有必需的权限,但myLocation返回nil CLLocation,因此cameraWithLatitude:longitude:zoom:获得0 0坐标并显示非洲而不是我的实际位置(不在非洲:) :)

2 个答案:

答案 0 :(得分:13)

来自官方Google Maps iOS SDK文档:

  
      
  • (BOOL)myLocationEnabled [read,write,assign]   控制是否启用“我的位置”点和精度圆。
  •   
     

默认为NO。

     
      
  • (CLLocation *)myLocation [read,assign]   如果启用了“我的位置”,则显示正在绘制用户位置点的位置。
  •   
     

如果已禁用,或者已启用但没有可用的位置数据,则为零。使用KVO可以观察到这个属性。

因此,当您设置mapView_.myLocationEnabled = YES;时,它仅告知mapView仅在您为myLocation属性提供位置值时才显示蓝点。 Google的示例代码显示了如何使用KVO方法观察用户位置。(推荐)您还可以实现CLLocationManagerDelegate方法来更新mapView。

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    [mapView animateToLocation:newLocation.coordinate];
    // some code...
}

以下是Google地图示例代码中有关如何使用KVO更新用户位置的代码。

// in viewDidLoad method...
// Listen to the myLocation property of GMSMapView.
  [mapView_ addObserver:self
             forKeyPath:@"myLocation"
                options:NSKeyValueObservingOptionNew
                context:NULL];
// Ask for My Location data after the map has already been added to the UI.
  dispatch_async(dispatch_get_main_queue(), ^{
    mapView_.myLocationEnabled = YES;
  });

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
  if (!firstLocationUpdate_) {
    // If the first location update has not yet been recieved, then jump to that
    // location.
    firstLocationUpdate_ = YES;
    CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey];
    mapView_.camera = [GMSCameraPosition cameraWithTarget:location.coordinate
                                                     zoom:14];
  }
}

答案 1 :(得分:-4)

尝试使用MapKit,在 VieDidLoad ViewWillApper 下使用:

myMapView.showsUserLocation = YES;

如果需要,您可以在IBAction下添加此简单代码,例如:

- (IBAction)getLocation:(id)sender{

         myMapView.showsUserLocation = YES;

}

我希望这可以帮到你