开发者

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?


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];
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜