GMSMapView myLocation не дает фактического местоположения

У меня есть GMSMapView, правильно загруженный и работающий внутри моего контроллера просмотра

то, что я не могу сделать, это установить 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 и отображает Африку вместо моего фактического местоположения (это не в Африке :))


person Zerho    schedule 28.06.2013    source источник


Ответы (2)


Из официальной документации Google Maps iOS SDK:

  • (BOOL) myLocationEnabled [чтение, запись, назначение] Определяет, включена ли точка «Мое местоположение» и круг точности.

По умолчанию НЕТ.

  • (CLLocation*) myLocation [чтение, назначение] Если включена функция «Мое местоположение», показывает, где рисуется точка местоположения пользователя.

Если он отключен или включен, но данные о местоположении недоступны, это будет нуль. Это свойство можно наблюдать с помощью 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 Maps о том, как использовать 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];
  }
}
person Jing    schedule 07.07.2013
comment
является ли ваша переменная firstLocationUpdate_ просто логическим свойством? - person kevinl; 10.07.2013
comment
@kevinl да, на самом деле вторые фрагменты кода скопированы из примера кода Google ... - person Jing; 11.07.2013
comment
не могу поверить, что Google не включил метод в GMSMapViewDelegate, использование KVO в этом случае является своего рода взломом... - person Chris Chen; 16.10.2013

Попробуйте использовать MapKit в разделе VieDidLoad или ViewWillApper, используя:

myMapView.showsUserLocation = YES;

Вы можете добавить этот простой код в IBAction, если хотите, например:

- (IBAction)getLocation:(id)sender{

         myMapView.showsUserLocation = YES;

}

Я надеюсь, что это поможет вам

person BlackSheep    schedule 28.06.2013
comment
мне нужно использовать карты Google, а MapKit и GMS в любом случае работают вместе - person Zerho; 28.06.2013
comment
но mapKit использует карту Google, и я думаю, но не уверен, что есть тот же метод, что и «showUserLocation» или «getUserLocation», тогда вы можете добавить масштабирование и «coordinate.latitude» и «longitude» - person BlackSheep; 28.06.2013