Ricardo
Ricardo

Reputation: 13

MKMapView annotation position update problem

I need to track user current location with realtime refreshrate I have one function with two solutions for that.

- (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 //Variant_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      
}

Variant_1 works good but when you move fast the location sing on the map blinks.
Variant_2 does not blink but does not move location sing however moves map.
Where is the problem?

Upvotes: 1

Views: 1804

Answers (1)

user467105
user467105

Reputation:

In Variant_1, it probably blinks because you're doing a removeAnnotation and then an addAnnotation instead of just modifying the coordinates of the existing annotation.

In Variant_2, initWithCoordinate returns a new MKPlacemark object with those coordinates. It doesn't update the properties of the object you are calling the method on.

What happens if you run the setCoordinate line instead?

A separate question is why not use the MKMapView's built-in ability to show the current user location? Just do m_Map.showsUserLocation = YES; at the start. You don't need CLLocationManager to get the user's current location if you are using the MKMapView anyway.

I think you'll still need to center the map on the user's current location using one of the map view delegate methods:

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

Upvotes: 2

Related Questions