Проблема с обновлением позиции аннотации MKMapView

Мне нужно отслеживать текущее местоположение пользователя с частотой обновления в реальном времени. У меня есть одна функция с двумя решениями для этого.

  • (void) locationManager: (CLLocationManager *) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation {

ifdef Variant_1

if(m_currentLocation)
    [m_Map removeAnnotation:m_currentLocation];
else
    m_currentLocation = [MKPlacemark alloc];
[m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil];
[m_Map addAnnotation:m_currentLocation];
[m_Map setCenterCoordinate:m_currentLocation.coordinate animated:YES];

else // Вариант_2

if(m_currentLocation == nil)
 {
 m_currentLocation = [MKPlacemark alloc];
 [m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil];
 [m_Map addAnnotation:m_currentLocation];
 
 }else
 {
 [m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil];
 //[m_currentLocation setCoordinate:newLocation.coordinate];
 }
[m_Map setCenterCoordinate:m_currentLocation.coordinate animated:YES];

endif

}

Вариант_1 работает хорошо, но при быстром перемещении точка на карте мигает. Вариант_2 не мигает, но не перемещает местоположение, но перемещает карту. В чем проблема? Тебя не так.


person Ricardo    schedule 31.10.2010    source источник


Ответы (1)


В Variant_1 он, вероятно, мигает, потому что вы выполняете removeAnnotation, а затем addAnnotation, а не просто изменяете координаты существующей аннотации.

В Variant_2 initWithCoordinate возвращает новый объект MKPlacemark с этими координатами. Он не обновляет свойства объекта, для которого вы вызываете метод.

Что произойдет, если вместо этого вы запустите строку setCoordinate?

Отдельный вопрос: почему бы не использовать встроенную возможность MKMapView показывать текущее местоположение пользователя? Просто сделайте m_Map.showsUserLocation = YES; в начале. Вам не нужен CLLocationManager для получения текущего местоположения пользователя, если вы все равно используете MKMapView.

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

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}
person Community    schedule 31.10.2010