Почему MKMapView уводит меня в море? - PullRequest
6 голосов
/ 08 сентября 2010

У меня есть этот код, чтобы установить карту в местоположении пользователя:

MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2; 

CLLocationCoordinate2D location=mapView.userLocation.coordinate;
location = mapView.userLocation.location.coordinate;

MKCoordinateRegion region;
region.span=span;
region.center=location;

[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];

Теперь, когда я делаю mapView.showsUserLocation=YES, он показывает мое местоположение в нужном месте (на моем устройстве, и Apple HQсимулятор) однако, оба раза приведенный выше код ставит меня в море где-то недалеко от Африки!

Есть идеи?

Ответы [ 4 ]

14 голосов
/ 08 сентября 2010

Пара широта / долгота 0/0 находится на экваторе к югу от Гринвича, Англия.Это место находится в Гвинейском заливе у западного побережья Африки.Если именно там находится ваш пин-код, значит, ваш mapView.userLocation не устанавливается.

Возможно, ваш код выполняется до того, как MKMapKit сможет найти его местоположение.Что вы действительно хотите сделать, так это чтобы ваш viewController принял протокол MKMapKitDelegate, установите для свойства .delegate представления карты значение self, а затем реализуйте метод:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

Этот метод будетвызывается, когда набор карт находит пользователя, и вы можете использовать значение userLocation, которое вы передали ему, чтобы установить регион на карте.До тех пор, пока это не будет вызвано в первый раз, MapView все еще работает над определением местоположения, и ваш запрос о его местонахождении является преждевременным.

Кроме того, ваш regionThatFits там в конце не используется.Этот метод не изменяет размер области на месте, он на самом деле возвращает измененную область, которую вы можете использовать, как вам угодно.Таким образом, вы хотите установить область отображения карты на то, что возвращает этот метод.Как это:

[mapView setRegion:[mapView regionThatFits:region] animated:TRUE];
0 голосов
/ 16 января 2017

Я отвечаю на этот вопрос, потому что выбранный ответ действительно не помог мне, и у меня возникла точно такая же проблема. didUpdateUserLocation не очень практичен, потому что он обновляет приложение каждый раз, когда меняется местоположение. Другая проблема с вышеупомянутым решением состоит в том, что, когда карта загружается, еще слишком рано спрашивать местоположение. Итак, как вы спрашиваете местоположение пользователя до загрузки карты, чтобы масштабирование не привело вас в Африку?

Вам необходимо запросить местоположение с помощью диспетчера местоположений в viewDidLoad. Затем после этого вы можете установить регион.

SWIFT 3

   //top of your class
   let locManger  = CLLocationManager()


   override func viewDidLoad()   {
        super.viewDidLoad()


         //request user location
         locManager.startUpdatingLocation()


        //this is the code that sets the region based on the location

        let span = MKCoordinateSpanMake(0.5, 0.5)

        let location = CLLocationCoordinate2DMake((locManager.location?.coordinate.latitude)!, (locManager.location?.coordinate.longitude)!)

        let region = MKCoordinateRegionMake(location, span)

        yourMap.setRegion(region, animated: false)


        //stop location updating 
        locManager.stopUpdatingLocation()
 }
0 голосов
/ 13 марта 2016

Вы можете выбрать этот метод ..

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated{

CLGeocoder *ceo = [[CLGeocoder alloc]init];
CLLocation *loc = [[CLLocation alloc]initWithLatitude:_mapView.region.center.latitude longitude:_mapView.region.center.longitude];
CLLocationAccuracy accuracy = _mapView.userLocation.location.horizontalAccuracy;

if (accuracy) {
    current_pickup_location = loc;
    [_currentStreetSpinner startAnimating];
    [ceo reverseGeocodeLocation:loc
              completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error){
                  CLPlacemark *placemark = [placemarks objectAtIndex:0];
                  NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                  //                  NSLog(@"location %@",placemark.location);
                  NSLog(@"I am currently at %@",locatedAt);
                  _currentStreetLabel.text = locatedAt;
                  static_iVar = _currentStreetLabel.text;
                  [_currentStreetSpinner stopAnimating];
                  [self listDoctorsWithSpeciality_id:currentSpeciality_id
                               withProfessionalityId:currentProfessionality_id];
              }];
}

}

0 голосов
/ 22 февраля 2016

Что я сделал, так это добавил следующую запись в info.plist:

NSLocationAlwaysUsageDescription

Получил эту информацию в этом (очень хорошем) уроке: https://www.youtube.com/watch?v=Z272SMC9zuQ

...