1

我需要使用实时刷新率来跟踪用户当前位置我有一个功能和两个解决方案。

- (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效果很好,但是当您快速移动时,地图上的位置会闪烁。
Variant_2不闪烁但不移动位置唱歌但移动地图。
问题出在哪里?

4

1 回答 1

2

在 Variant_1 中,它可能会闪烁,因为您正在执行 removeAnnotation 然后是 addAnnotation 而不是仅修改现有注释的坐标。

在 Variant_2 中,initWithCoordinate返回具有这些坐标的新 MKPlacemark 对象。它不会更新您正在调用该方法的对象的属性。

如果你改为运行 setCoordinate 行会发生什么?

另一个问题是为什么不使用 MKMapView 的内置功能来显示当前用户位置?一开始就做m_Map.showsUserLocation = YES;。如果您仍然使用 MKMapView,则不需要 CLLocationManager 来获取用户的当前位置。

我认为您仍然需要使用地图视图委托方法之一将地图置于用户当前位置的中心:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}
于 2010-10-31T19:58:35.417 回答