Как предотвратить обновление карты - PullRequest
8 голосов
/ 08 декабря 2011

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

Некоторый код

- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"Found your location!");
    MKCoordinateRegion mapregion;
    map.showsUserLocation = YES;
    mapregion.center.latitude = map.userLocation.coordinate.latitude;
    mapregion.center.longitude = map.userLocation.coordinate.longitude;
    mapregion.span = MKCoordinateSpanMake(0.005,0.005);
    [map setRegion:mapregion animated:YES];
    map.userLocation.title = @"You're here";
    // map.mapType =  MKUserTrackingModeNone;

    // (found this on apple developer site, I think this can 
    // help but I have no clue at all //someone know what you can use this for?)
}

// In case you have the flightmode on...
- (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error 
{
    NSLog(@"gick inte att hitta position!");
    map.showsUserLocation = YES;
    MKCoordinateRegion mapregion;
    mapregion.center.latitude =(59.329444);
    mapregion.center.longitude =(18.068611);
    mapregion.span.latitudeDelta = 0.03;
    mapregion.span.longitudeDelta = 0.03;
    mapregion = [map regionThatFits:mapregion];
    [map setRegion:mapregion animated:TRUE];
}

- (void)viewDidLoad
{
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    map.delegate = self;
}

Я действительно надеюсь, что кто-то знает, как этого добиться ...

Ответы [ 4 ]

9 голосов
/ 08 декабря 2011

Ваша проблема в том, что вы устанавливаете центр карты каждый раз, когда местоположение пользователя обновляется.Это одно из решений ... в вашем заголовке:

BOOL userLocationShown;

, а затем ...

- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if(userLocationShown) return;
    // ... your code
    userLocationShown = YES;
}

Или, если вы никогда не хотите центрировать карту на пользователе, вы можете просто удалитьследующие строки:

    mapregion.center.latitude = map.userLocation.coordinate.latitude;
    mapregion.center.longitude = map.userLocation.coordinate.longitude;
    mapregion.span = MKCoordinateSpanMake(0.005,0.005);
    [map setRegion:mapregion animated:YES];
6 голосов
/ 08 декабря 2011

Если устройство все еще получает обновления местоположения, даже если вы их игнорируете, оно работает с GPS и прожигает батарею. После того, как вы заблокировали их местоположение, либо проверив, сколько раз они переместились, либо измерив точность исправления (CLLocation. HorizontalAccuracy), вы можете просто отключить обновления местоположения в виде карты следующим образом:

self.showsUserLocation = NO;

Если бы вы использовали CLLocationManager, это было бы

[locationManager stopUpdatingLocation];
1 голос
/ 10 ноября 2012

Я бы предложил объединить эти хорошие ответы в одно решение - перестать заставлять карту возвращаться к вашему местоположению после достижения желаемой горизонтальной точности.100 метров - это хорошо для меня, но не стесняйтесь использовать другое число:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if (userLocation.location.horizontalAccuracy < 100) { // less than 100 metres
        return;
    }
    // Your existing code
}
0 голосов
/ 08 декабря 2011

То, что я сделал для аналогичной ситуации, было создание переменной для отслеживания того, сколько раз я центрировал карту, и позволял запускать ее только 3 или 4 раза. Я сделал это, потому что, если бы я только однажды сосредоточился на пользователе, иногда области с плохим соединением заставляли карту не концентрироваться на использовании, а вместо этого были на значительном расстоянии. Таким образом, вы можете сделать что-то вроде этого:

NSInteger timesUpdated = 0;

- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if(timesUpdated<2) return;
    // ... your code
    timesUpdated++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...