Предотвращение постоянного изменения масштаба MKMapView и его повторного центрирования в местоположении пользователя - PullRequest
11 голосов
/ 23 сентября 2011

У меня, похоже, есть проблема, противоположная многим из тех, что выложены здесь о MKMapView. Вместо того, чтобы заставить его увеличивать масштаб и отображать текущее местоположение, я не могу заставить его остановить при этом. Вот что происходит:

  • Запускаю приложение
  • MKMapView показывает мое местоположение с синей точкой
  • Я уменьшаю и удаляю карту пальцами
  • Через несколько секунд MKMapView неожиданно снова возвращается к центру моего текущего местоположения

Я пытался сказать своим CLLocationManager на stopUpdatingLocation (без эффекта, поскольку MKMapView знает, как использовать CoreLocation), и я пытался передать MKMapView на setShowsUserLocation:NO (нет синяя точка отображается вообще, что не то, что я хочу). Я даже пытался устранить мой CLLocationManager (без эффекта). Что вызывает это и как я могу остановить это?


Да, я устанавливаю точность и расстояние менеджера местоположения в -loadView.

Я не реализую -mapViewDidFinishLoadingMap :. Вот моя реализация

-locationManager:didUpdateToLocation:fromLocation:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    // How many seconds ago was this new location created?
    NSTimeInterval t = [[newLocation timestamp] timeIntervalSinceNow];

    // CLLocationManagers will return the last found location of the device first,
    // you don't want that data in this case. If this location was made more than 3
    // minutes ago, ignore it.
    if (t < -180)
    {
        // This is cached data, you don't want it, keep looking
        return;
    }

    [locationManager stopUpdatingLocation];
}

Я думаю, это то, о чем вы спрашиваете, @ Анна Каренина:

- (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u
{
    CLLocationCoordinate2D loc = [u coordinate];
    // Display the region 500 meters square around the current location
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 500, 500);
    [mv setRegion:region animated:YES];
}

Ответы [ 3 ]

4 голосов
/ 09 июля 2012

Не реализовывать - (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u метод.

Вместо этого использовать locationmanager didUpdateToLocation.

didUpdateUserLocation вызывается несколько раз без какой-либо причины. Где didUpdateToLocation вызывается при любых изменениях местоположения.

Тогда вы можете вручную установить область mkmapview в методе didUpdateToLocation.

0 голосов
/ 30 июня 2017

Я использую dispatch_once в методе MKMapViewDelegate для масштабирования только один раз в начале.Вот код.

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation  {    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        CLLocationCoordinate2D newCoordinate = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude);

        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newCoordinate, 500, 500);
        [mapView setRegion:region animated:YES];
    });
}
0 голосов
/ 23 сентября 2011

Во-первых, и я не знаю, что это сильно повлияет, но вы устанавливаете точность управления местоположением и фильтр расстояний вообще в viewDidLoad (или везде, где вы используете свой LocationManager):

[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDistanceFilter:kCLDistanceFilterNone];

Во-вторых, проверьте эти 2 функции в вашем источнике ( игнорируйте содержание фактических функций, которые я перечислил здесь, это просто для иллюстрации и чтобы показать использование ) и, если возможно, предоставьте свой код для этих функцийчтобы мы могли лучше помочь:

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    [activityIndicator stopAnimating];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSDate* eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
    if (abs(howRecent) < 15.0)
    {
        NSLog(@"New Latitude %+.6f, Longitude %+.6f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
    }
}
...