2012-03-29 3 views
7

Я пытаюсь показать текущее местоположение пользователя, установив свойство MKMapView i.e setShowsUserLocation - YES. По умолчанию стрелка появляется в верхнем левом углу экрана iPhone, когда приложение начинает обновлять местоположение пользователя. Но после отображения текущего местоположения стрелка должна исчезнуть, но ее все еще присутствует, пока приложение запущено, что означает, что приложение все еще остается обновление местоположения в фоновом режиме? так как я могу остановить обновление текущего местоположения? я реализовал делегат, который будет вызываться немедленно ..Показать текущее местоположение пользователя с помощью MKMapView?

ответ

15

Если карта видна и имеет showUserLocation установлен на YES, она продолжает обновляться в фоновом режиме.

Вам нужно отменить это, когда представление исчезнет или когда приложение перейдет на задний план. Лучшим способом, вероятно, было бы зарегистрировать ваш viewController для получения уведомлений для UIApplicationDidEnterBackgroundNotification и UIApplicationDidBecomeActiveNotification.

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appToBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appReturnsActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 
} 

Тогда в методе, называемом этим уведомлением, изменить свойства отображения карты относительно userLocation:

- (void)appToBackground{ 
    [mapview setShowsUserLocation:NO]; 
} 

И

- (void)appReturnsActive{ 
    [mapview setShowsUserLocation:YES]; 
} 

Убедитесь, что эти методы действительно вызывается установив точку останова там и вернуться на главный экран.

+2

Я использовал этот метод, но я получаю то, что по-видимому, является сбоем гонки при входе в фоновый режим: '[MKMapView (UserPositioning) stopUpdatingUserLocation]' calls' [MKMapView (UserPositioningInternal) removeUserLocation] ', который взрывается с помощью SIGSEGV. Не думайте, что вы уже видели/решили это? –

+0

нужно удалить наблюдателя, когда 'viewDidUnload'? – Raptor

+1

@MichaelKernahan У меня такая же проблема. Вы когда-нибудь находили решение? – horsejockey

0

Вы можете остановить обновление местоположения, отправив сообщение для менеджера данного адреса [self.locationManager stopUpdatingLocation];

Что касается вашего случая, вы пытались прекратить показ местоположения пользователей?

+0

Я не использую никакого менеджера местоположений .. если я его остановил, он тоже скрывает аннотацию (местоположение) – hemant

+0

Попробуйте внедрить 'CLLocationManagerDelegate', у вас будет лучший способ контролировать CoreLocation Framework. Вы можете найти хороший начальный учебник здесь: http://www.switchonthecode.com/tutorials/getting-your-location-in-an-iphone-application –

1

Я согласен с Майклом Кернаханом, я уверен, что есть состояние гонки внутри MKMapView.

MKMapView пытается удалить userLocationAnnotation (голубая точка) самостоятельно, как только он осознает, что потерял доступ к службам определения местоположения.

Однако, это не кажется, защищен, и если разработчик также выдает [mapView setShowsUserLocation:NO], весьма вероятно, чтобы получить крах из-за гонки между внутренней резьбой MKMapView «s пытается удалить userLocationAnnotation, и поток, который звонит setShowsUserLocation:NO.

+0

Согласовано. Это, похоже, проблема в iOS 7.x, в частности. Я не думаю, что я еще не видел его на 8.x. – Kevin

Смежные вопросы