我使用CLLocationManager的坐标在地图上显示用户的位置。每次我移动或缩放地图时,用户位置引脚(带有声纳效果的蓝色引脚)都会消失,然后重新出现在地图上。(我指的不是声纳动画效果。蓝点真的消失了,然后在)中重新激活。
当地图滚动/缩放时,我没有调用任何其他方法。使用断点,在map的委托方法中只调用返回的nil:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
//User's Pin
if([annotation class] == MKUserLocation.class) {
return nil;
}
....rest of my code here, nothing else is called as I am only plotting user at this time...
}
在我最初的回答中,我认为目标是替换当您使用showUserLocation = YES
和userTrackingMode = MKUserTrackingModeFollow
的MKMapView
时获得的闪烁蓝点。因此,我展示了如何用图像或标准引脚替换它。
但事实证明,问题不在于有一个蓝点显示当前位置,而是它的动画被打断了,当用户在地图上平移和缩放时,它会出现和消失。
如果调用removeAnnotations
并删除所有注释(包括系统生成的MKUserLocation
注释),我已经看到了这种行为。如果你关闭showUserLocation
然后再打开它,我也看到了这种行为。
OP指出这些情况都不适用,但对于将来的读者,这些是可能导致这种行为的一些注意事项。
原始回答:
最简单的答案是确保您的控制器是MKMapView
的delegate
,然后定义检测MKUserLocation
的viewForAnnotation
,并用您想要的任何内容替换注释视图。例如,如果您想显示一个@"user.png"
图像,它可能看起来像:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
{
NSString *annotationIdentifier = @"userlocation";
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (annotationView)
{
annotationView.annotation = annotation;
}
else
{
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
annotationView.image = [UIImage imageNamed:@"user.png"];
}
return annotationView;
}
// again, if you had other annotation types, such as MKPointAnnotation,
// handle them here
if ([annotation isKindOfClass:[MKPointAnnotation class]])
{
...
}
return nil;
}
或者,如果你想显示一个标准的引脚,你可以:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
{
if ([annotation isKindOfClass:[MKUserLocation class]])
{
NSString *annotationIdentifier = @"userlocation";
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (annotationView)
{
annotationView.annotation = annotation;
}
else
{
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
}
return annotationView;
}
}
// again, if you had other annotation types, such as MKPointAnnotation,
// handle them here
if ([annotation isKindOfClass:[MKPointAnnotation class]])
{
...
}
return nil;
}
捕获viewForAnnotation委托方法下的默认用户位置注释,因此它不会被绘制。你可以使用布尔值来打开和关闭它,或者与LocationManager一起创建你自己的自定义注释。这个链接应该能让你找到正确的方向:
用户位置编号
如果您使用标准的mapciew.showsUserLocation = true;
来绘制用户的位置,并且它在屏幕上滑动而不是在位置上脉动,那么这可能是因为您的viewForAnnotation
方法。请确保你只是添加的大头针动画,而不是mapview添加的用户位置动画。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
{
return nil;
}
//do stuff to the annotations that you added
}